Solucion Taller 2 PL-SQL
Solucion Taller 2 PL-SQL
Solucion Taller 2 PL-SQL
11 DE OCTUBRE DE 2021
UNIVERSIDAD DE SAN BUENAVENTURA
Ingeniería De Sistemas
Taller 2 PL/SQL
De todos los puntos se debe entregar el DDL, DML y PL/SQL utilizados en MySQL y Oracle.
1. De acuerdo con el siguiente modelo, desarrollar los puntos de PL/SQL en MySQL y Oracle
1.1. Realizar una función que devuelva la suma de pagos que ha realizado. Como parámetro
pasa el código.
Oracle
create or replace function Pagos_cliente(v_codigocliente
clientes.codigocliente%type)
return Number
as
v_sumapagos pagos.cantidad%type := 0;
begin
return v_sumapagos;
end;
/
declare
v_codigocliente clientes.codigocliente%type := &codigo;
v_suma pagos.cantidad%type;
begin
v_suma := Pagos_cliente(v_codigocliente);
DBMS_OUTPUT.PUT_LINE('La suma de pagos es ' || v_suma);
end;
/
1.2. Realizar una función que me devuelva la suma de pagos que ha realizado. Como
parámetro pasa el código. En caso de que no se encuentre devuelve un -1.
Oracle
create or replace function Pagos_cliente(v_codigocliente
clientes.codigocliente%type)
return Number
as
v_sumapagos pagos.cantidad%type := 0;
begin
end;
/
declare
v_codigocliente clientes.codigocliente%type := &codigo;
v_suma pagos.cantidad%type;
begin
v_suma := Pagos_cliente(v_codigocliente);
if v_suma = -1 then
DBMS_OUTPUT.PUT_LINE('El cliente no existe');
else
DBMS_OUTPUT.PUT_LINE('La suma de pagos es ' || v_suma);
end if;
end;
/
1.3. Realizar un método o procedimiento que muestre el total en euros de un pedido, Como
parámetro pasa el código. En caso de que no se encuentre devuelve un 0. Pásale otro
parámetro, si supera ese límite, lanzaremos una excepción propia y devolveremos un 0.
Oracle
create or replace function total_pedido_func
(v_codigopedido pedidos.codigopedido%type, v_limite
number)
return number
as
v_total number(8) := 0;
limite_superado exception;
begin
select sum(dp.cantidad * dp.PRECIOUNIDAD) into v_total
from pedidos p, detallepedidos dp
where p.codigopedido = dp.codigopedido and p.codigopedido =
v_codigopedido;
if v_total is null then
raise no_data_found;
else
if v_limite > v_total then
raise limite_superado;
else
return v_total;
end if;
end if;
exception
when no_data_found then
return -1;
when limite_superado then
DBMS_OUTPUT.PUT_LINE('Limite superado');
return 0;
end;
/
declare
v_codigopedido pedidos.codigopedido%type := &codigo;
v_total number(8);
v_limite number(8) := &limite;
begin
v_total := total_pedido_func(v_codigopedido , v_limite);
if v_total = -1 then
DBMS_OUTPUT.PUT_LINE('no existe el pedido');
else
DBMS_OUTPUT.PUT_LINE('El pedido total es ' || v_total);
end if;
end;
/
1.4. Crea una función a la que le pasaremos como parámetros de entrada:
CODIGOPRODUCTO, NUEVO_PRECIO_VENTA. la función modificara los datos del
producto que tenga el código introducido actualizando el PRECIOVENTA de la siguiente
forma:
1.4.1.Si PRECIOVENTA es nulo hacer un update en el campo precioventa asignándole el
valor de NUEVO_PRECIO_VENTA
1.4.2.Si no hacer un update en el campo PRECIOVENTA asignándole el valor de
PRECIOVENTA +(PRECIOVENTA - NUEVO_PRECIO_VENTA).
1.4.3.La función devolverá el número de filas actualizadas crea un bloque anónimo que
ejecute la función anterior y muestre el resultado devuelto por la función.
Oracle
v_CODIGOPRODUCTO PRODUCTOS.CODIGOPRODUCTO%type,
v_NUEVO_PRECIOVENTA PRODUCTOS.PRECIOVENTA%type)
return number
as
v_PRECIOVENTA PRODUCTOS.PRECIOVENTA%type;
begin
select PRECIOVENTA into v_PRECIOVENTA
from PRODUCTOS where CODIGOPRODUCTO = v_CODIGOPRODUCTO;
else
update PRODUCTOS
set PRECIOVENTA = PRECIOVENTA+(PRECIOVENTA-v_NUEVO_PRECIOVENTA)
return SQL%ROWCOUNT;
end;
/
select * from PRODUCTOS
DECLARE
v_CODIGOPRODUCTO PRODUCTOS.CODIGOPRODUCTO%type :=
&CodigoProducto;
v_NUEVO_PRECIOVENTA PRODUCTOS.PRECIOVENTA%type :=
&nuevo_precio;
v_total_filas number(8);
BEGIN
v_total_filas := actualizaPrecio(v_CODIGOPRODUCTO,
v_NUEVO_PRECIOVENTA);
DBMS_OUTPUT.put_line('Se han modificado ' || v_total_filas || '
filas');
END;
Oracle
as
pedido pedidos%rowtype;
begin
select * into pedido
from pedidos
where codigocliente = p_codigocliente
update pedidos
set precio = ps_nuevo_precio
EXCEPTION
WHEN no_data_found then
/
declare
v_nuevo_precio pedidos.precio%type;
begin
end;
/
2.1. Previamente deberemos crear una tabla AUDITORIA_EMPLEADOS para registrar los
eventos a auditar que ocurran sobre la tabla EMPLEADOS.
2.2. Crea un trigger que, cada vez que se inserte o elimine un empleado, registre una entrada
en la tabla AUDITORIA_EMPLEADOS con la fecha del suceso, número y nombre de
empleado, así como el tipo de operación realizada (INSERCIÓN o ELIMINACIÓN).
Oracle
CREATE OR REPLACE TRIGGER insercion_eliminacion_empleado AFTER
INSERT OR DELETE ON empleados
FOR EACH ROW
BEGIN
IF inserting THEN
INSERT INTO auditoria_empleados VALUES ( to_char(sysdate,
'DD/MM/YYYY HH:MI:SS')
|| ' - INSERCIÓN
- '
|| :new.numem
|| ' '
|| :new.nomem );
ELSIF deleting THEN
INSERT INTO auditoria_empleados VALUES ( to_char(sysdate,
'DD/MM/YYYY HH:MI:SS')
|| ' -
ELIMINACIÓN - '
|| :old.numem
|| ' '
|| :old.nomem );
END IF;
END insercion_eliminacion_empleado;
2.3. Crea un trigger que, cada vez que se modifiquen datos de un empleado, registre una
entrada en la tabla AUDITORIA_EMPLEADOS con la fecha del suceso, valor antiguo y valor
nuevo de cada campo, así como el tipo de operación realizada (en este caso
MODIFICACIÓN).
Oracle
CREATE OR REPLACE
TRIGGER Modificacion_empleado
AFTER UPDATE ON EMPLEADOS
FOR EACH ROW
DECLARE
cadena VARCHAR2(200);
BEGIN
cadena := TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MI:SS')
|| ' - MODIFICACIÓN - ' || :new.NUMEM || ' ' || :new.NOMEM || ' -
';
IF UPDATING('NUMEM') THEN
cadena := cadena || 'Num. empleado: '
|| :old.NUMEM || '-->' || :new.NUMEM;
END IF;
IF UPDATING('NOMEM') THEN
cadena := cadena || ', Nombre: '
|| :old.NOMEM || '-->' || :new.NOMEM || ', ';
END IF;
IF UPDATING('SALAR') THEN
cadena := cadena || ', Salario: '
|| :old.SALAR || '-->' || :new.SALAR || ', ';
END IF;
IF UPDATING('COMIS') THEN
cadena := cadena || ', Comisión: '
|| :old.COMIS || '-->' || :new.COMIS || ', ';
END IF;
IF UPDATING('NUMHI') THEN
cadena := cadena || ', Hijos: '
|| :old.NUMHI || '-->' || :new.NUMHI || ', ';
END IF;
IF UPDATING('EXTEL') THEN
cadena := cadena || ', Extensión: '
|| :old.EXTEL || '-->' || :new.EXTEL || ', ';
END IF;
IF UPDATING('NUMDE') THEN
cadena := cadena || ', Num. Departamento: '
|| :old.NUMDE || '-->' || :new.NUMDE || ', ';
END IF;
INSERT INTO AUDITORIA_EMPLEADOS VALUES(cadena);
END Modificacion_empleado;
2.4. Crea un trigger para que registre en la tabla AUDITORIA_EMPLEADOS las subidas de
salarios superiores al 5%.
Oracle
CREATE OR REPLACE
TRIGGER Subida_salario
AFTER UPDATE OF SALAR ON EMPLEADOS
FOR EACH ROW
BEGIN
IF (:new.SALAR - :old.SALAR) > (:old.SALAR * 0.05) THEN
INSERT INTO AUDITORIA_EMPLEADOS
VALUES(TO_CHAR(SYSDATE,'DD/MM/YYYY HH:MI:SS')
|| ' - MODIFICACIÓN SALARIO - '
|| :old.NUMEM || ' ' || :old.NOMEM || ' - '
|| :old.SALAR || ' --> ' || :new.SALAR );
END IF;
END Subida_salario;
2.5. Crea un trigger para que registre en la tabla AUDITORIA_EMPLEADOS las modificaciones
de los jefes de cada departamento.