Sie sind auf Seite 1von 65

Trabajo Bases de Datos II

Segundo Parcial Nombre: Ronny Estrella PLSQL - EJEMPLOS Y EJERCICIOS EL INGRESO Y LA CONECCION A LA BASE DE DATOS USTED PUEDE DESARROLLARLO CON EL USUARIO O ESQUEMA SCOTT O HR 1.-Usuario Dba conn system/espe1 as sysdba

2--Iniciamos Nuestra Base Datos: startup

3.-Nos cambiamos de Usuario: conn scott / tiger

4.-Seteamos las variables set pagesize 300; set linesize 300;

5.-Para usted ver los Errores en Consola: SHOW error;

6.-Para saber el tiempo que dura una consulta o una funcin: SET timing ON; desc emp;

7.-Entrada de datos con &: select sal, ename from emp where empno= &nombre;

8.-Para mostrar el un valor en pantalla:Nombre de la asignatura: Aplicacin de Bases de Datos set serveroutput ON;

9.-Para no mostrar por pantalla el valor anterior a la variable: set verify off; DECLARE v_fecha date:='&fecha'; BEGIN DBMS_OUTPUT.PUT_LINE ('La Fecha Es: ' ||to_char(v_fecha)); end; /

10.-Declarando variable del mismo tipo que la columna: DECLARE v_nombre emp.ename%type; BEGIN SELECT ENAME INTO v_nombre

FROM emp WHERE ROWNUM=1; DBMS_OUTPUT.PUT_LINE (v_nombre); END; /

11.-Ejemplo de IF-THEN: DECLARE v_numero integer :=&Numero; v_mensaje varchar2(40); BEGIN IF v_numero = 1 THEN v_mensaje :='Es uno'; DBMS_OUTPUT.PUT_LINE (v_mensaje); END IF; END; /

12.-Ejemplo de IF-THEN-ELSE: DECLARE v_salario integer :=&Salario; v_mensaje varchar2(50); BEGIN IF v_salario < 10000 THEN v_mensaje:='Empleado Publico'; DBMS_OUTPUT.PUT_LINE(v_mensaje); ELSE v_mensaje :='Empleado Privado'; DBMS_OUTPUT.PUT_LINE(v_mensaje); END IF; END; /

13.-Ejemplo de CASE: DECLARE v_salario integer :=&Salario; v_mensaje varchar2(90); BEGIN CASE WHEN v_salario < 10000 THEN v_mensaje :='Empleado Publico'; ELSE v_mensaje :='Empleado Privado'; END CASE; DBMS_OUTPUT.PUT_LINE (v_mensaje); END; /

14.-Ejemplo de BUCLE: --Primero creamos la tabla donde vamos a insertar: create table contador (numeros integer); --Ahora vamos a crear nuestro primer BUCLE: DECLARE v_contador binary_integer:=1; BEGIN LOOP INSERT INTO contador VALUES (v_contador); v_contador:=v_contador +1; EXIT WHEN v_contador =100; END LOOP; END; /

15.-Ahora vamos saber cuntos registros se insertaron: SELECT count(*) Cantidad FROM contador;

16.-Ejemplo con el BUCLE WHILE: DECLARE v_contador binary_integer:=1; BEGIN WHILE v_contador < 100 LOOP INSERT INTO contador VALUES (v_contador); v_contador:=v_contador +1; END LOOP;

END; /

17.-Ejemplo BUCLE FOR: DECLARE BEGIN FOR v_contador IN 1..100 LOOP INSERT INTO contador VALUES (v_contador); END LOOP; END; / --Ahora vamos a comprobar que est funcionando nuestro BUCLE FOR: SELECT count(*) FROM contador;

18.-Primero crearemos la tabla donde insertaremos; CREATE TABLE emp3 AS SELECT empno, ename, job, sal, deptno FROM emp WHERE 1=3;

19.-Aqui iniciamos nuestro Ejemplo DECLARE p_empno emp.empno%TYPE; p_ename emp.ename%TYPE; p_job emp.job%TYPE; p_sal emp.sal%TYPE;

p_deptno emp.deptno%TYPE; CURSOR cname (p_deptno number) IS SELECT empno, ename, job, sal, deptno FROM emp WHERE deptno=p_deptno; BEGIN OPEN cname (30); FETCH cname INTO p_empno, p_ename, p_job, p_sal, p_deptno; INSERT INTO emp3 VALUES (p_empno, p_ename, p_job, p_sal, p_deptno); CLOSE cname; END; /

20.-Aqu consultamos la tabla donde insertbamos el cursor: SELECT * FROM emp3;

21.-Cursor Implcito: DECLARE p_empno emp.empno%TYPE; p_ename emp.ename%TYPE; p_job emp.job%TYPE; p_sal emp.sal%TYPE; p_deptno emp.deptno%TYPE; BEGIN SELECT empno, ename, job, sal, deptno INTO p_empno, p_ename, p_job, p_sal, p_deptno FROM emp WHERE empno=7369; INSERT INTO emp3 VALUES (p_empno, p_ename, p_job, p_sal, p_deptno); END; /

22.-Ahora vamos a consultar la tabla donde estamos insertando:

SELECT * FROM emp3;

23.-Otro ejemplo del Cursor Implcito. DECLARE n number; BEGIN SELECT 1 INTO n FROM dual; DBMS_OUTPUT.PUT_LINE('Usted ha Selecionado ['||SQL%ROWCOUNT||']'); END; /

24.-Ejemplo de SQL%ROWCOUNT: BEGIN UPDATE emp SET sal =60000 WHERE deptno =10; DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||' Fueron Actualizados en la Tabla emp');

END; /

25.-Bucle FOR para Cursores: DECLARE CURSOR cback_emp IS SELECT empno, ename, sal, job, deptno FROM emp ; BEGIN FOR k IN cback_emp LOOP INSERT INTO emp3 VALUES (k.empno, k.ename, k.job, k.sal, k.deptno); END LOOP; END; /

26.-Ahora observamos la tabla emp3. Si inserto los datos:

select * from emp3;

27.-Otro ejemplo ms DECLARE CURSOR c_emp IS SELECT * FROM emp; BEGIN FOR fcld IN c_emp LOOP DBMS_OUTPUT.PUT_LINE (fcld.ENAME ||' Usted Gana '|| fcld.sal); END LOOP; END; /

28.-Cursores Parametrizados: DECLARE v_departamento emp.deptno%TYPE :='&v_deptno'; CURSOR c_salario (v_deptno emp.deptno%type) IS SELECT ename, job, sal FROM emp WHERE deptno=v_deptno; BEGIN FOR fcld IN c_salario (v_departamento) LOOP DBMS_OUTPUT.PUT_LINE('Salario del Departamento:'|| v_departamento||' ES: '||fcld.sal); END LOOP; END; /

29.-Procedimientos Almacenados: CREATE OR REPLACE PROCEDURE fcld IS v_fcld varchar2(50); BEGIN v_fcld := 'Fundacion Codigo Libre'; DBMS_OUTPUT.PUT_LINE(v_fcld); END; /

30.-Ahora vamos poner a funcionar el procedimiento: BEGIN fcld(); END; /

31.-Procedimiento con parmetro de entrada y valor por defecto: CREATE OR REPLACE PROCEDURE empleado ( nombre varchar2 DEFAULT 'Jose Paredes', telefono number DEFAULT 8094767759, fecha date DEFAULT SYSDATE) AS BEGIN DBMS_OUTPUT.PUT_LINE (nombre||' '||' '|| telefono||' '||fecha); END; /

32.-Ahora correremos el procedimiento empleado: BEGIN empleado; END; /

33.-Pasndole parmetros: BEGIN empleado ('Manuel', 80999777798); END; /

34.-Procedimiento que insertar en emp3 los empleados de un departamento dado: CREATE OR REPLACE PROCEDURE pinsertemp ( pe_deptno emp.deptno%TYPE) IS p_empno emp.empno%TYPE; p_ename emp.ename%TYPE;

p_job emp.job%TYPE; p_sal emp.sal%TYPE; p_deptno emp.deptno%TYPE; CURSOR c_empleado IS SELECT empno, ename, job, sal, deptno FROM emp WHERE deptno=pe_deptno; BEGIN OPEN c_empleado; LOOP FETCH c_empleado INTO p_empno, p_ename, p_job, p_sal, p_deptno ; INSERT INTO emp3 VALUES (p_empno, p_ename, p_job, p_sal, p_deptno); END LOOP; CLOSE c_empleado; END; /

35.-Con este mandato vemos los errores generados en consolas: show error;

36.-Ahora correremos el procedimiento pinsertemp: BEGIN pinsertemp(30); END; /

37.-Ahora confirme que el procedimiento realiz su funcin: select * from emp3;

38.-Procedimiento que actualiza el salario de un empleado dado: CREATE OR REPLACE PROCEDURE act_salario ( e_empno number, n_salario number) IS BEGIN UPDATE emp3 SET sal=n_salario WHERE empno=e_empno; END act_salario; /

39.-Ahora correremos el Procedimiento act_salario: BEGIN act_salario(7499, 7000); COMMIT; END; /

40.-Observamos los cambios en la tabla emp3: SELECT * FROM emp3;

41.-Procedimiento que actualiza el salario para todos los empleados de un departamento: CREATE OR REPLACE PROCEDURE act_saldept ( e_deptno IN emp.deptno %TYPE, n_salario IN emp.sal%TYPE) IS CURSOR c_dept IS SELECT * FROM emp WHERE deptno=e_deptno; BEGIN FOR L IN c_dept LOOP UPDATE emp3 SET sal=n_salario WHERE deptno=e_deptno; COMMIT; END LOOP; END;

42.-Ahora correremos el Procedimiento act_saldept: BEGIN act_saldept(10, 8900); END; /

43.-Observamos los datos de la tabla donde se actualiz el Procedimiento act_saldept: SELECT * FROM emp3; show error;

44.-El siguiente Procedimiento Insertar en una tabla el valor que tome de entrada: CREATE OR REPLACE PROCEDURE insert_emp3 (p_empno number, p_sal number) IS BEGIN INSERT INTO emp3 (empno, sal) VALUES (p_empno, p_sal); END; /

45.-Ahora correremos el Procedimiento insert_emp3: BEGIN insert_emp3(1212, 1234); END; /

46.-Vamos a confirmar que el Procedimiento insert_emp3 funcion: SELECT * FROM emp3;

47.-Para realizar el siguiente Procedimiento tendremos que agregar un Primary key a la tabla emp3: ALTER TABLE emp3 ADD CONSTRAINT pk_emp3 PRIMARY KEY(empno); DELETE FROM emp3;

48.-Procedimiento que nos informar de la ltima persona insertada y lanzar un mensaje si intentamos insertar un empleado con el mismo empno de otro ya insertado: CREATE OR REPLACE PROCEDURE insert_ver (p_empno emp3.empno%TYPE, p_ename emp3.ename%TYPE, p_job emp3.job%TYPE, p_sal emp3.sal%TYPE) AS v_insertado varchar2(40); BEGIN INSERT INTO emp3 (empno, ename, job, sal) VALUES (p_empno, p_ename, p_job, p_sal); BEGIN SELECT ename INTO v_insertado FROM emp3 where empno = (SELECT MAX(empno) FROM emp3); DBMS_OUTPUT.PUT_LINE('El Ultimo Empleado Fue: '||v_insertado); END; COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Numero de Empleado Duplicado OK.'); DBMS_OUTPUT.PUT_LINE ('empno '||p_empno); END; /

49.-Ahora vamos Ejecutar el Procedimiento insert_ver: BEGIN insert_ver(2, 'Paredes', 'GNU', 19000); END; /

50.-Observe los datos de la tabla emp3: SELECT * FROM emp3;

51.-Procedimiento que tomar datos de la tabla employees y los insertara en emp y nos informar cunto insert: CREATE OR REPLACE PROCEDURE emplo_emp IS v_nombre varchar2(35); v_salario number (8,2); CURSOR c_employees IS SELECT * FROM hr.employees; BEGIN FOR k IN c_employees LOOP v_nombre := k.first_name; v_salario := k.salary; BEGIN INSERT INTO emp3 (empno, ename, sal) VALUES (k.employee_id, k.first_name, k.salary); END; END LOOP; COMMIT; END; /

52.-Vamos a correr el Procedimiento emplo_emp: BEGIN emplo_emp; END; /

conn hr/espe1 GRANT select ON hr.employees TO scott; 53.-Algunos campos no tienen la misma precisin, as que la aumentaremos o cambiamos el tipo de datos: ALTER TABLE emp3 MODIFY ename varchar2(50);

54.-Ahora vamos a ver los si los datos seleccionados de employees estan en emp: SELECT * FROM emp3;

55.-Procedimiento que Imprime en nmero de veces la entrada: CREATE OR REPLACE PROCEDURE print_n ( n number, mensaje varchar2) IS k number :=8094767758; BEGIN FOR k IN 1..n LOOP DBMS_OUTPUT.PUT_LINE(k||'-'||mensaje); END LOOP; END; /

56.-Ahora vamos a poner a correr el Procedimiento print_n: BEGIN print_n(10, 'Fundacion Codigo Libre'); END; /

57.-Procedimiento Utilizando TYPE RECORD en un Procedimiento: CREATE OR REPLACE PROCEDURE emprecord ( cod emp.empno%TYPE) IS TYPE reg IS RECORD ( id_empleado emp.empno%TYPE, nombre emp.ename%TYPE, salario emp.sal%TYPE); r reg; BEGIN SELECT empno, ename , sal INTO r FROM emp WHERE empno=cod;

INSERT INTO emp3 (empno, ename, sal) VALUES (r.id_empleado, r.nombre, r.salario); DBMS_OUTPUT.PUT_LINE('Nombre: '||r.nombre); DBMS_OUTPUT.PUT_LINE('Salario: '||r.salario); END; /

58.-Ahora vamos correr el procedimiento emprecord: BEGIN emprecord(7499); END; /

59.-Procedimiento que aumenta un 40 a los empleados que estn por debajo del salario mnimo: CREATE OR REPLACE PROCEDURE aum_sal IS v_minimo pls_integer := 6400; v_contador binary_integer; BEGIN UPDATE emp SET sal=sal*1.60 where sal < v_minimo; DBMS_OUTPUT.PUT_LINE('Se Actualizaron: '||SQL%ROWCOUNT ||' Registros' ); END; /

60.-Antes de Ejecutar el Procedimiento, vamos a ver cuntos empleados hay por debajo del salario mnimo: SELECT * FROM emp WHERE sal < 6400;

61.-Ejecutado el Procedimiento aum_sal: BEGIN aum_sal; END; /

Cambiamos de usuario para realizar los siguientes ejemplos:

conn hr/espe1 62.-Miramos nuestro catlogo. SELECT * FROM cat;

63.-Procedimiento con ROWTYPE, EXCEPTION y SQLERRM: CREATE OR REPLACE PROCEDURE printout (cod number) IS jose hr.employees%ROWTYPE; BEGIN SELECT * INTO jose FROM employees WHERE employee_id=cod; DBMS_OUTPUT.PUT_LINE('Nombre: '|| jose.first_name); DBMS_OUTPUT.PUT_LINE('Salario: '|| jose.Salary); DBMS_OUTPUT.PUT_LINE('Ingreso: '|| jose.hire_date); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Codigo Incorrecto ');

DBMS_OUTPUT.PUT_LINE('El Codigo del Error es '||SQLERRM); END; /

64.-Ahora ejecutaremos el Procedimiento printout. BEGIN printout(1463); END; /

65.-Procedimiento para eliminar registro de una tabla: --Cambiamos de Esquema: conn scott/kikla CREATE OR REPLACE PROCEDURE eliuser (Id_depart emp.empno%TYPE)

IS BEGIN DELETE FROM emp WHERE deptno=Id_depart; DBMS_OUTPUT.PUT_LINE('Registros Eliminados: '||SQL%ROWCOUNT); END; /

66.-Ahora ejecutaremos el Procedimiento eliuser: BEGIN eliuser(10); END; /

67.-Procedimiento que actualizar todos los email a codigolibre.org: --Cambiamos de usuario: conn hr/espe1 CREATE OR REPLACE PROCEDURE actmail IS

CURSOR cmail IS SELECT * FROM employees; BEGIN UPDATE employees SET email=LOWER(email||'@codigolibre.org'); IF SQL%ROWCOUNT > 0 THEN BEGIN FOR mi IN cmail LOOP DBMS_OUTPUT.PUT_LINE('Correos Actualizados: '||mi.email); END LOOP; END; END IF; EXCEPTION WHEN OTHERS THEN NULL; END; /

68.-Ahora vamos ejecutar el procedimiento actmail: BEGIN actmail; END; /

69.-Verificamos en la tabla employees para ver si se efectu la actualizacin: SELECT email FROM employees;

70.-Nota:El campo est definido con una rango de 25 caracteres; hay que aumentarlos: ALTER TABLE employees modify email varchar2(60);

71.-Ahora vemos la estructura de la tabla para confirmar la precisin del campo: DESC employees;

72.-Procedimiento para almacenar en un archivo los resultados de un SELECT: CREATE OR REPLACE PROCEDURE inexel IS v_contador number(10); CURSOR c_empleados IS SELECT * FROM hr.employees; r hr.employees%ROWTYPE; BEGIN FOR r IN c_empleados LOOP DBMS_OUTPUT.PUT_LINE(r.employee_id||'-'|| r.first_name||''||r.last_name||'-'||r.salary); EXIT WHEN c_empleados%NOTFOUND; END LOOP; DBMS_OUTPUT.PUT_LINE('Estos Son Todos Los Empleados Ok...'); BEGIN SELECT COUNT(*) INTO v_contador FROM hr.employees;

DBMS_OUTPUT.PUT_LINE('La Cantidad de Empleados que Tenemos es: ' ||v_contador); END; END; /

73.-Ahora vamos a ejecutar el Procedimiento inexel: BEGIN inexel; END; /

74.-Para aumentar el Buffer: set serveroutput ON size 4000;

75.-Para ver todos los PROCEDURE del usuario actual: SELECT * FROM user_procedures;

76.-Creacin de Funciones: --Funcin que Retorna un Valor: CREATE OR REPLACE FUNCTION verlo RETURN int AS BEGIN

RETURN 900000; END; /

77.-Ahora ejecutamos la Funcin verlo: SELECT verlo FROM dual;

78.-Funcion que Retorna la suma de dos numero: CREATE OR REPLACE FUNCTION FcldSuma RETURN INT as v_uno INT := 1; v_dos INT := 2; v_resultado INT; BEGIN v_resultado := v_uno+v_dos; RETURN v_resultado; END; /

79.-Ahora llamaremos la Funcin FcldSuma: SELECT FcldSuma() FROM dual;

80.-Funcin que nos devuelve el da actual: CREATE OR REPLACE FUNCTION diah RETURN VARCHAR AS v_dia varchar2(40); BEGIN SELECT TO_CHAR(SYSDATE, 'DAY') INTO v_dia FROM dual; RETURN v_dia; END; /

81.-Ahora vamos a ejecutar la Funcin diah: SELECT diah FROM dual;

82.-Funcin que recibe una fecha y devuelve el da de esa fecha: CREATE OR REPLACE FUNCTION diad(p_fecha IN date) RETURN VARCHAR IS v_fecha varchar2(34); BEGIN SELECT TO_CHAR(p_fecha, 'DAY') INTO v_fecha FROM dual; RETURN v_fecha; END; /

83.-Ahora vamos a probar la Funcin diad: SELECT diad('13081978') Resultado FROM dual;

84.-Nota: Si tenemos algn problema, vemos el formato: SELECT SYSDATE FROM DUAL;

85.-Funcin que nos devuelve el Itbis de un valor dado: CREATE OR REPLACE FUNCTION itbis_fcld (f_valor IN number) RETURN INTEGER IS v_valor number; v_subtotal number := 0.16; BEGIN v_valor := v_subtotal * f_valor; RETURN v_valor; END; /

86.-Ahora Ejecutamos la Funcin itbis_fcld: SELECT itbis_fcld(1000) FROM dual;

87.-Funcin que devuelva el salario para un empleado dado; CREATE OR REPLACE FUNCTION salemp (f_empleado employees.employee_id%TYPE) RETURN number IS v_salario employees.salary%TYPE; BEGIN SELECT salary INTO v_salario FROM employees WHERE employee_id=f_empleado; RETURN v_salario; END ; /

88.-Ahora Vamos ejecutar la Funcin salemp: SELECT salemp(195) FROM dual;

89.-Funcin concatenando dos Campos y EXCEPTION: CREATE OR REPLACE FUNCTION concatenado (f_empleado employees.employee_id%TYPE) RETURN varchar2 IS v_persona VARCHAR2(100); BEGIN SELECT first_name ||' '|| last_name||' Salario RD$'||salary INTO v_persona FROM employees WHERE employee_id=f_empleado; RETURN v_persona; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Este Empleado No Esta el Base Datos'); RETURN NULL; END; /

90.-Ahora vamos a ejecutar la Funcin concatenando para un empleado dado: SELECT concatenado(14) FROM dual; SELECT concatenado(146) FROM dual;

91.-Funcin que determina el nmero dado utilizando CASE: CREATE OR REPLACE FUNCTION numero (num number) RETURN varchar2 IS v_numero varchar2(60); BEGIN CASE num WHEN 1 THEN

v_numero := 'Uno'; WHEN 2 THEN v_numero := 'Dos'; WHEN 3 THEN v_numero := 'Tres'; WHEN 4 THEN v_numero := 'Cuatro'; WHEN 5 THEN v_numero := 'Cinco'; ELSE v_numero := 'Solo Tengo En Lista Hasta 5 Ok...'; END CASE; RETURN v_numero; EXCEPTION WHEN no_data_found THEN v_numero :='Numero Invalido'; RETURN v_numero; END; /

92.-Ejecutando la Funcin nmero: SELECT nmero(10) FROM dual;

93.-Funcin que devuelve el factorial: CREATE OR REPLACE FUNCTION factorial (fact number) RETURN number IS f number :=1; cont number :=fact; BEGIN LOOP

f:=f*cont; cont:=cont -1; EXIT WHEN (cont = 0); END LOOP; RETURN f; END; /

94.-Ejecutando la Funcin factorial: SELECT factorial(10) FROM dual;

95.-La misma Funcin pero con un FOR: CREATE OR REPLACE FUNCTION factorial2 (fact number) RETURN number IS f number :=1;

BEGIN FOR k IN 1.. fact LOOP f:=f*k; END LOOP; RETURN f; END; /

96.-Ejecutamos la Funcin factorial2: SELECT factorial(10) FROM dual;

97.-Funcin que devuelve la potencia y adems acepta dos nmeros de entrada: CREATE OR REPLACE FUNCTION potencia (base in number, exponente in number) RETURN number IS c number :=1;

BEGIN FOR i IN 1.. exponente LOOP c := c * base; END LOOP; RETURN c; END; /

98.-Ahora Ejecutemos la Funcin potencia: SELECT potencia(10, 2) FROM dual;

99.-Funcin que realiza la multiplicacin de dos numeros, devolviendo el resultado: CREATE OR REPLACE FUNCTION mult (primer number, segundo number) RETURN number IS v_resultado number; BEGIN

v_resultado := primer*segundo; RETURN v_resultado; EXCEPTION WHEN OTHERS THEN v_resultado :=0; END; /

100.-Ejecutemos la Funcin mult: SELECT mult(10, 5) FROM dual; --Funcin que nos da un Nivel Salarial Utizando CASE CREATE OR REPLACE FUNCTION nivelsal (p_empleado hr.employees.employee_id%TYPE) RETURN varchar2 IS v_sal hr.employees.salary%TYPE; v_msg varchar2(40); v_na varchar2(40) := 'El Salario Es: '; BEGIN SELECT salary INTO v_sal

FROM employees WHERE employee_id=p_empleado; CASE WHEN (v_sal > 0 AND v_sal <= 2500) THEN v_msg := 'Salario de Guaria'; WHEN (v_sal > 2500 AND v_sal <= 4000) THEN v_msg := 'Salario de Capitan'; WHEN (v_sal > 4000 AND v_sal <= 8000) THEN v_msg := 'Salario de Coroneles'; WHEN (v_sal > 8000) THEN v_msg := 'Salario de GNU/Linuxero'; ELSE v_msg := 'Salario Desconocido, Posible Botella'; END CASE; DBMS_OUTPUT.PUT_LINE(v_sal||'-'||v_msg); RETURN (v_na||v_sal); EXCEPTION WHEN OTHERS THEN v_msg := 'No es Empleado'; RETURN v_msg; END; /

101.Ahora Ejecutemos la Funcion nivelsal: SELECT nivelsal(199) FROM dual;

SELECT first_name, nivelsal(employee_id) FROM employees;

102.-Funcin nivelsal Utilizando IF-ELSIF-ELSE: CREATE OR REPLACE FUNCTION nivelsal2 (v_empleado IN employees.employee_id%TYPE) RETURN varchar2 IS v_sal employees.salary%TYPE; v_msg varchar2(40); BEGIN SELECT salary INTO v_sal FROM employees

WHERE employee_id=v_empleado; IF (v_sal > 0 AND v_sal <= 2500) THEN v_msg := 'Salario de Guaria'; ELSIF (v_sal > 2500 AND v_sal <= 4000) THEN v_msg := 'Salario de Capitan'; ELSE v_msg := 'Salario Para Pegaooo'; END IF; v_msg := to_char(v_sal||'-'||v_msg); RETURN v_msg; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Este Empleado aun no es Botella...'); RETURN v_msg; END; /

103.-Ahora vamos a ejecutar la Funcin nivelsal2: SELECT nivelsal2(190) FROM dual;