Está en la página 1de 10

SOLUCIÓN TALLER 2

Laura Valentina Torres y Jonathan Nicolas Quintero

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

select sum(cantidad) into v_sumapagos


from pagos
where codigocliente = v_codigocliente;

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

select sum(cantidad) into v_sumapagos


from pagos
where codigocliente = v_codigocliente;

if v_sumapagos is null then


raise no_data_found;
else
return v_sumapagos;
end if;
exception
when no_data_found then
return -1;

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

create or replace function actualizaPrecio (

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;

if v_NUEVO_PRECIOVENTA is null then


update PRODUCTOS

set PRECIOVENTA = v_NUEVO_PRECIOVENTA


where CODIGOPRODUCTO = v_CODIGOPRODUCTO;

else
update PRODUCTOS
set PRECIOVENTA = PRECIOVENTA+(PRECIOVENTA-v_NUEVO_PRECIOVENTA)

where CODIGOPRODUCTO = v_CODIGOPRODUCTO;


end if;

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;

1.5. l procedimiento deberá controlar en los pedidos los siguientes supuestos:


1.5.1.Si no existe un registro con ese CODIGOCLIENTE y CODIGOPEDIDO saltara a la zona
de excepciones y mostrara un mensaje “no existe la venta introducida”
1.5.2.Si existe la venta introducida:
1.5.2.1. mostrará el precio antiguo ||
1.5.2.2. actualizara el precio subiendo 1000 euros
1.5.2.3. devolverá en un parámetro de salida del procedimiento(ps_nuevo_precio)
el precio nuevo tras l Crea un procedimiento al que le pasaremos el
CODIGOCLIENTE y CODIGOPEDIDO. E a actualización crea un bloque anónimo
que llame al procedimiento anterior y muestre el precio nuevo devuelto por el
procedimiento.

Oracle

create or replace procedure actualizaPedidos(


p_codigocliente pedidos.codigocliente%type,
p_codigopedido pedidos.codigopedido%type,

ps_nuevo_precio out pedidos.precio%type


)

as
pedido pedidos%rowtype;

begin
select * into pedido

from pedidos
where codigocliente = p_codigocliente

and codigopedido = p_codigopedido;


DBMS_OUTPUT.PUT_line('el precio antiguo es ' ||
pedidos.precio);
ps_nuevo_precio := pedidos.precio + 1000;

update pedidos
set precio = ps_nuevo_precio

where codigocliente = p_codigocliente


and codigopedido = p_codigopedido;

EXCEPTION
WHEN no_data_found then

DBMS_OUTPUT.PUT_line('No existe el pedido introducido');


end;

/
declare

v_codigocliente pedidos.codigocliente%type := &codigocliente;


v_codigopedido pedidos.codigopedido%type := &codigopedido;

v_nuevo_precio pedidos.precio%type;
begin

actualizaVenta(v_codigocliente, v_codigopedido, v_nuevo_precio);


if v_nuevo_precio is not null then
DBMS_OUTPUT.PUT_line('el nuevo precio es ' || v_nuevo_precio);
end if;

end;
/

2. De acuerdo al siguiente modelo, desarrollar los puntos de PL/SQL en MySQL y Oracle

2.1. Previamente deberemos crear una tabla AUDITORIA_EMPLEADOS para registrar los
eventos a auditar que ocurran sobre la tabla EMPLEADOS.

CREATE TABLE AUDITORIA_EMPLEADOS (


id number(6) NOT NULL AUTO_INCREMENT,
fecha TIMESTAMP NOT NULL,
descripcion VARCHAR2(200) NOT NULL,
PRIMARY KEY(id)
);

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.

También podría gustarte