Está en la página 1de 4

UTFSM – Sede Viña del Mar

PL/SQL

Laboratorio 3: Procedimientos, Funciones, Triggers

OBJETIVOS:
Acercar al alumno a la práctica del uso de procedimientos, funciones y triggers
abarcando los temas anteriores.

Ejercicio previo con parámetro de salida:

CREATE OR REPLACE PROCEDURE consulta_emp


(v_id IN empleado.cod_emp%TYPE,
v_nombre OUT empleado.nom_emp%TYPE,
v_sueldo OUT empleado.salario_sem%TYPE,
v_comis OUT empleado.comision%TYPE)
IS
BEGIN
SELECT nom_emp, salario_sem, comision
INTO v_nombre, v_sueldo, v_comis
FROM empleado
WHERE cod_emp=v_id;
END consulta_emp;

Con variables en bloque PL/SQL:

declare
v_n empleado.nom_emp%type;
v_s empleado.salario_sem%type;
v_c empleado.comision%type;
begin
consulta_emp(7654,v_n,v_s,v_c);
dbms_output.put_line(v_n || v_s || v_c);
end;

CGB 1
UTFSM – Sede Viña del Mar

EJERCICIOS

1) Escribir un procedimiento que tenga un parámetro de entrada correspondiente a un


valor de salario de empleado. Este procedimiento deberá mostrar los empleados que
tengan dicho salario, sino deberá enviar un mensaje que indique que no se encontraron
datos.

2) Crear un procedimiento para visualizar la cantidad de empleados que tiene(n) a cargo


uno o más supervisores de un departamento determinado. El parámetro que se entrega
es el código del departamento. Se pide que muestre el código del supervisor, nombre del
supervisor, código del departamento al cual pertenece con la cantidad de empleados a su
cargo.

3) Crear una función que resuelva una ecuación de primer grado. Si la ecuación es
ax+b= 0, a y b son los datos a leer, las posibles soluciones son:

 a distinto de 0, entonces x = -b/a, retorne x.


 a=0, b distinto de cero, entonces ‘solución imposible’, retorne 0
 a =0, b=0, entonces ‘solución indeterminada’, retorne -1

4) Implemente la función recursiva del Factorial: “Para todo Número Natural n, se


llama n factorial o factorial de n al producto de todos los enteros entre 1 y n, con:

n! = 1*2*3*4*…*(n-1)*n

si: n<0 => retorna -1, n =0 => retorna 1, n>=1 => (n-1)!*n”

5) Implemente la función recursiva de la sucesión de Fibonacci: “Una sucesión de


Fibonacci es aquella donde cada número es el resultado de sumar los dos que lo
preceden. Así, la primera y más básica serie de Fibonacci sería:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233...

6) Escriba una función que reciba un empleo, por ejemplo ‘vendedor’ y que retorne el
promedio de salario de dicha actividad, si la actividad ingresada no existe que retorne
-1. Puede ocupar la función NVL que devuelve el valor recibido como parámetro en el
caso de que expresión sea NULL, o expresión en caso contrario: NVL(<expresion>,
<valor>), por ejemplo:
SELECT CO_PRODUCTO, NVL(PRECIO, 0) FROM PRECIOS;
devuelve 0 si el precio es nulo y si no lo es devuelve el valor de precio.

CGB 2
UTFSM – Sede Viña del Mar

7) Se muestra un disparador de base de datos (con la creación de una tabla de auditoría),


el cual se debe depurar:

a) Escriba, ejecute y depure el siguiente código:

CREATE TABLE auditaremple (


col1 VARCHAR2(200)
);

CREATE OR REPLACE TRIGGER auditar_act_emp


BEFORE INSERT OR DELETE
ON EMPLEADO
FOR EACH ROW
BEGIN
IF DELETING THEN
INSERT INTO AUDITAREMPLE
VALUES(TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*')
|| OLD.COD_EMP|| '*' || OLD.NOM_EMP || '* BORRADO ');
ELSIF INSERTING THEN
INSERT INTO AUDITAREMPLE
VALUES(TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*')
|| NEW.COD_EMP || '*' || NEW.NOM_EMP||'* INSERCION ');
END IF;
END;

b) Redacte un texto que indique exactamente (línea por línea) que está haciendo el
trigger

Luego haga:

insert into empleado values (7950, 'Carmen', 'analista','7934','17/11/83',1500,0,40,3);

y posteriormente elimine al empleado.

c) Verifique lo que encuentre en la tabla auditaremple. Copie el resultado a su hoja de


resolución.

8) Escribir un trigger que permita auditar antes de ocurrir, las modificaciones en la tabla
empleado insertando en la tabla auditaremple los siguientes datos:
- Fecha y hora
- Número de empleado
- Nombre de empleado
- La operación de actualización: MODIFICACIÓN.
- El valor anterior y el valor nuevo de cada columna modificada. (solo las columnas
modificadas). Debe ser campo por campo, por ejemplo:
IF UPDATING ('NOM_EMP') THEN …
Realizando un update a la tabla empleado, verifique lo que guarda la tabla auditaremple

CGB 3
UTFSM – Sede Viña del Mar

9) Escribir un disparador que haga fallar (a través de Raise_application_error con


número -20001) cualquier operación de modificación del nombre o del código de un
empleado, o que suponga un aumento de sueldo superior al 10%. Para probar el trigger:
Haga un update del salario de todos los empleados en un 30%.

10) Escriba un trigger que al insertar un nuevo tramo de sueldo (grado: 6,


sueldo_minimo: 10000, sueldo_maximo: 11000), actualice el salario semanal de los
empleados más antiguos contratados al sueldo mínimo recién ingresado.

11) Procedimiento insertar_nuevo_depto: Permite insertar un departamento nuevo. El


procedimiento recibe el nombre y la ubicación del nuevo departamento. Creará el nuevo
departamento comprobando que el nombre no se duplique, la ubicación será pasada a
una función llamada codigo_depto (de la siguiente pregunta), la cual retornará el código
de departamento al procedimiento. Enviar un mensaje confirmando la inserción o bien
enviando una excepción si el nombre está duplicado.

12) Función codigo_depto. Recibe la ubicación y le asignará como número de


departamento la decena siguiente al último número de departamento utilizado, si es que
la ubicación no existe en la tabla. Si la ubicación se repite, le asignará como número de
departamento un número más al último código de departamento que ya tiene esa
ubicación, para ir ordenando los códigos, según la ubicación.

13) Crear un procedimiento denominado prueba_dep_emp al que se le pasan un número


de departamento y un empleo y que verifique si existe en ese departamento ese trabajo.
Utilizar:
 Una tabla indexada para almacenar las combinaciones válidas de departamento y
trabajos.
 Si encuentra que existe, que envíe un mensaje indicando tal situación
 Levantar un error de aplicación con el mensaje adecuado si la combinación no es
válida.

Comprobar si el trabajo ‘vendedor’ es válido en el departamento 30 y lo mismo en el


departamento 20.

CGB 4

También podría gustarte