Está en la página 1de 10

Desarrollo de Aplicaciones Multiplataforma – Bases de datos

UD06 – PL-SQL
Realiza los siguientes ejercicios en PL-SQL, para ellos créalos en SQLDeveloped, cuando los
tengas creados guárdalos en este documento en los recuadros marcados o en un archivo.sql
con la nomenclatura UD06-001, UD06-002,…

Cuando los tengas todos resueltos envíalos en un archivo .zip con el nombre:

 DAM-UD06-Apellidos, nombre-DNI.zip
 DAM-UD06-Totana García, Luis Regino-48484848E.zip
 DAW-UD06-Apellidos, nombre.zip
 DAW-UD06-Totana García, Luis Regino-48484848E.zip

1. Mostrar ‘Hola mundo’ por pantalla.

BEGIN
DBMS_OUTPUT.PUT_LINE('HOLA
MUNDO');
END;

2. Declarar una variable numérica y mostrar si es mayor de 10 o no.

DECLARE
NUMERO NUMBER:=2;
BEGIN
IF NUMERO>10 THEN
DBMS_OUTPUT.PUT_LINE('NUMERO MAYOR QUE 10');
ELSE
DBMS_OUTPUT.PUT_LINE('NUMERO MENOR QUE 10');
END IF;
END;
3. Declarar una variable numérica y pedir su valor y mostrarlo.

DECLARE
NUMERO NUMBER:=№
BEGIN
DBMS_OUTPUT.PUT_LINE('El numero es '||
NUMERO);
END;
4. Mostrar los números del 1 al 100 con un while.

DECLARE
NUMERO NUMBER:=1;

pág. 1
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

BEGIN
WHILE(NUMERO<=100)
LOOP
DBMS_OUTPUT.PUT_LINE(NUMERO);
NUMERO:=NUMERO+1;
END LOOP;
END;
5. Mostrar los números del 1 al 100 con un for.

BEGIN
FOR NUMERO IN 1..100
LOOP
DBMS_OUTPUT.PUT_LINE(NUMERO);
END LOOP;
END;
6. Mostrar los números del 1 al 100 con un loop.

DECLARE
NUMERO NUMBER:=1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(NUMERO);
EXIT WHEN NUMERO=100;
NUMERO:=NUMERO+1;
END LOOP;
END;
7. Mostrar el nombre de un cliente dado su código.

DECLARE
V_CODIGOCLIENTE CLIENTE.CODIGO_CLIENTE%TYPE :=&CODIGO;
V_NOMBRECLIENTE CLIENTE.NOMBRE_CLIENTE%TYPE;
BEGIN
SELECT NOMBRE_CLIENTE INTO V_NOMBRECLIENTE
FROM CLIENTE
WHERE CODIGO_CLIENTE = V_CODIGOCLIENTE;
DBMS_OUTPUT.PUT_LINE('El cliente se llama '|| V_NOMBRECLIENTE);
END;

pág. 2
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

Dado el siguiente esquema de base de datos:

8. Mostrar el precioVenta y la gama de un producto dado su código.

DECLARE
V_CODIGOPRODUCTO PRODUCTO.CODIGO_PRODUCTO%TYPE :=&CODIGO;
V_NOMBREPRODUCTO PRODUCTO.NOMBRE%TYPE;
V_GAMAPRODUCTO PRODUCTO.GAMA%TYPE;
BEGIN
SELECT NOMBRE, GAMA INTO V_NOMBREPRODUCTO, V_GAMAPRODUCTO
FROM PRODUCTO
WHERE CODIGO_PRODUCTO = V_CODIGOPRODUCTO;
DBMS_OUTPUT.PUT_LINE('El nombre del producto es: '|| V_NOMBREPRODUCTO ||
' y su gama es ' ||V_GAMAPRODUCTO);
END;
9. Mostrar toda la información de un pedido dado su código (fechaEsperada, fechaEntrega,
fechapedido, estado, comentarios)

DECLARE
V_CODIGOPEDIDO PEDIDO.CODIGO_PEDIDO%TYPE :=&CODIGO;
V_PEDIDO PEDIDO%ROWTYPE;
BEGIN
SELECT * INTO V_PEDIDO
FROM PEDIDO
WHERE CODIGO_PEDIDO = V_CODIGOPEDIDO;
DBMS_OUTPUT.PUT_LINE('La fecha del pedido es: ' || v_pedido.fecha_pedido
|| ', la fecha esperada es: ' || v_pedido.fecha_esperada
|| ', la fecha de entrega es: '|| v_pedido.fecha_entrega
|| ', el estado es: '|| v_pedido.estado

pág. 3
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

|| ' y los comentarios del producto son: ' ||v_pedido.comentarios);


END;
10. Realizar una función que me devuelva la suma de pagos que ha realizado. Pasa el código
por parámetro.

CREATE OR REPLACE FUNCTION PAGOS_CLIENTES(V_CODIGOCLIENTE


CLIENTE.CODIGO_CLIENTE%TYPE)
RETURN NUMBER
AS
V_SUMAPAGOS PAGO.TOTAL%TYPE :=0;
BEGIN
SELECT SUM(TOTAL) INTO V_SUMAPAGOS
FROM PAGO
WHERE CODIGO_CLIENTE = V_CODIGOCLIENTE;
RETURN V_SUMAPAGOS;
END;
/
DECLARE
V_CODIGOCLIENTE CLIENTE.CODIGO_CLIENTE%TYPE :=&CODIGO;
V_SUMA PAGO.TOTAL%TYPE;
BEGIN
V_SUMA := PAGOS_CLIENTES(V_CODIGOCLIENTE);
DBMS_OUTPUT.PUT_LINE('La suma de los pagos es: ' ||v_suma);
end;
/
11. Realizar un método o procedimiento que muestre el total en euros de un pedido, pásale el
código por parámetro.

CREATE OR REPLACE PROCEDURE TOTAL_PEDIDOSS (V_CODIGOPEDIDOS


PEDIDO.CODIGO_PEDIDO%TYPE)
AS
V_TOTAL NUMBER (8) := 0;
BEGIN
SELECT SUM (D.CANTIDAD * D.PRECIO_UNIDAD) INTO V_TOTAL
FROM PEDIDO P, DETALLE_PEDIDO D
WHERE P.CODIGO_PEDIDO = D.CODIGO_PEDIDO
AND P.CODIGO_PEDIDO = V_CODIGOPEDIDOS;
DBMS_OUTPUT.PUT_LINE ('El pedido total es '|| V_TOTAL);
END;
/
DECLARE
V_CODIGOPEDIDOS PEDIDO.CODIGO_PEDIDO%TYPE := &CODIGO;
BEGIN
TOTAL_PEDIDOSS (V_CODIGOPEDIDOS);
END;
/
12. Mostrar el nombre de un cliente dado su código. Controla en caso de que no se encuentre,
mostrando un mensaje por ejemplo.

DECLARE

pág. 4
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

V_CODIGOCLIENTE CLIENTE.CODIGO_CLIENTE%TYPE :=&CODIGO;


V_NOMBRECLIENTE CLIENTE.NOMBRE_CLIENTE%TYPE;
BEGIN
SELECT NOMBRE_CLIENTE INTO V_NOMBRECLIENTE
FROM CLIENTE
WHERE CODIGO_CLIENTE =V_CODIGOCLIENTE;
dbms_output.put_line('El nombre del cliente es ' ||v_nombrecliente);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('El codigo no esta asignado a ningun cliente');
END;
/
13. Realizar una función que me devuelva la suma de pagos que ha realizado. Pasa el código
por parámetro. Controla en caso de que no se encuentre, en ese caso devuelve un -1.

CREATE OR REPLACE FUNCTION PAGOS_CLIENTE(V_CODIGOCLIENTE


CLIENTE.CODIGO_CLIENTE%TYPE)
RETURN NUMBER
AS
V_SUMAPAGOS PAGO.TOTAL%TYPE :=0;
BEGIN
SELECT SUM (TOTAL) INTO V_SUMAPAGOS
FROM PAGO
WHERE CODIGO_CLIENTE =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 CLIENTE.CODIGO_CLIENTE%TYPE :=&CODIGO;
V_SUMAPAGOS PAGO.TOTAL%TYPE;
BEGIN
V_SUMAPAGOS := PAGOS_CLIENTES(V_CODIGOCLIENTE);
IF V_SUMAPAGOS= -1 THEN
dbms_output.put_line('El codigo no esta asignado a ningun cliente');
else
dbms_output.put_line('La suma de los pagos es ' ||V_SUMAPAGOS || ' € ');
end if;
END;
/
14. Realizar un método o procedimiento que muestre el total en euros de un pedido, pásale el
código por parámetro. Controla en caso de que no se encuentre, en ese caso devuelve un 0.

pág. 5
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

Pásale otro parámetro, si supera ese límite, lanzaremos una excepción propia y devolveremos
un 0.

CREATE OR REPLACE FUNCTION TOTALPEDIDOS_FUN(V_CODIGOPEDIDO


PEDIDO.CODIGO_PEDIDO%TYPE,
V_LIMITE NUMBER)
RETURN NUMBER
AS
V_TOTAL NUMBER(10) :=0;
LIMITE_SUPERADO EXCEPTION;
BEGIN
SELECT SUM (D.CANTIDAD*D.PRECIO_UNIDAD) INTO V_TOTAL
FROM PEDIDO P, DETALLE_PEDIDO D
WHERE P.CODIGO_PEDIDO = D.CODIGO_PEDIDO
AND P.CODIGO_PEDIDO = 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('El limite a sido superado');
return 0;
end;
/
DECLARE
V_CODIGOPEDIDO PEDIDO.CODIGO_PEDIDO%TYPE :=&CODIGO;
V_TOTAL NUMBER(10);
V_LIMITE NUMBER(10) :=&LIMITE;
BEGIN
V_TOTAL := TOTALPEDIDOS_FUN(V_CODIGOPEDIDO, V_LIMITE);
IF V_TOTAL =-1 THEN
dbms_output.put_line('El codigo no se a asignado a ningun pedido');
ELSE
dbms_output.put_line('El pedido total es: '||V_TOTAL);
END IF;
END;
/
15. Crea una función a la que le pasaremos como parámetros de entrada: CODIGOCLIENTE,
LIMITECREDITO. La función modificara los datos del CLIENTE cuyo CODIGOCLIENTE coincida
con el parámetro que se pasa, de la siguiente forma:

pág. 6
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

 Si LIMITECREDITO está por debajo de 6000, hacer un update en el campo


LIMITECREDITO asignándole el valor de 6000
 Si no hacer un update en el campo LIMITECREDITO asignándole el valor de
LIMITECREDITO=LIMITECREDITO*1.10 .

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.

CREATE OR REPLACE FUNCTION ejercicio15(codCli CLIENTES.CODIGOCLIENTE%TYPE,


limite CLIENTES.LIMITECREDITO%TYPE)
RETURN NUMBER
AS
resultado NUMBER:=0;
limi CLIENTES.LIMITECREDITO%TYPE;
BEGIN
SELECT LIMITECREDITO INTO limi
FROM CLIENTES
WHERE CODIGOCLIENTE = codCli;

IF(limi<6000)THEN
UPDATE CLIENTES
SET LIMITECREDITO=6000
WHERE CODIGOCLIENTE=codCli;
ELSE
UPDATE CLIENTES
SET LIMITECREDITO=limite*1.10
WHERE CODIGOCLIENTE=codCli;
END IF;
resultado:=SQL%ROWCOUNT;
RETURN resultado;
END;
BEGIN

IF(ejercicio15(1,8000)>0)THEN
DBMS_OUTPUT.PUT_LINE('Se ha actualizado');
ELSE
DBMS_OUTPUT.PUT_LINE('No se ha actualizado');
END IF;
END;
SELECT * FROM CLIENTES

16. Crea un procedimiento al que le pasaremos el CODIGOPRODUCTO, y PRECIOVENTA. El


procedimiento deberá controlar en la tabla PRODUCTOS los siguientes supuestos:

- Si no existe un registro con ese CODIGOPEDIDO saltara a la zona de excepciones y mostrara


un mensaje “no existe el producto introducido”

- Si existe la venta introducida:

pág. 7
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

I. mostrará el PRECIOVENTA
II. actualizará el PRECIOVENTA subiendo un 10%
III. devolverá en un parámetro de salida del procedimiento(ps_nuevo_precio) el precio
nuevo tras la actualización crea un bloque anónimo que llame al procedimiento
anterior y muestre el precio nuevo devuelto por el procedimiento.

CREATE OR REPLACE PROCEDURE ejercicio16(


codProdu PRODUCTOS.CODIGOPRODUCTO%TYPE,
precioV PRODUCTOS.PRECIOVENTA%TYPE,
precioActu OUT PRODUCTOS.PRECIOVENTA%TYPE)
AS
cod PRODUCTOS.CODIGOPRODUCTO%TYPE;
preVenta PRODUCTOS.PRECIOVENTA%TYPE;
BEGIN

SELECT PRECIOVENTA INTO preVenta


FROM PRODUCTOS
WHERE CODIGOPRODUCTO =codProdu;

DBMS_OUTPUT.PUT_LINE('El precio de venta es:'||preVenta);

UPDATE PRODUCTOS
SET PRECIOVENTA=PRECIOVENTA*1.1
WHERE CODIGOPRODUCTO=codProdu;

SELECT PRECIOVENTA INTO precioActu


FROM PRODUCTOS
WHERE CODIGOPRODUCTO =codProdu;

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No se encuentran productos');
END;

declare
idProducto PRODUCTOS.CODIGOPRODUCTO%TYPE := 'FR-43';
precioVenta PRODUCTOS.PRECIOVENTA%TYPE :=100;
precioVentaAct PRODUCTOS.PRECIOVENTA%TYPE;
begin

ejercicio16(idProducto,precioVenta, precioVentaAct);
DBMS_OUTPUT.PUT_LINE(precioVentaAct);

end;
17. Crear un cursor para ver todos los clientes que no hayan hecho pagos. Hazlo con un loop.

DECLARE
V_NOMBRECLIENTE CLIENTE.NOMBRE_CLIENTE%TYPE;

pág. 8
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

CURSOR CURSOR_CLIENTESINPAGO IS
SELECT NOMBRE_CLIENTE
FROM CLIENTE C
WHERE NOT EXISTS (SELECT CODIGO_CLIENTE
FROM PAGO
WHERE CODIGO_CLIENTE =C.CODIGO_CLIENTE);
BEGIN
OPEN CURSOR_CLIENTESINPAGO;
LOOP
FETCH CURSOR_CLIENTESINPAGO INTO V_NOMBRECLIENTE;
EXIT WHEN CURSOR_CLIENTESINPAGO%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_NOMBRECLIENTE);
END LOOP;
CLOSE CURSOR_CLIENTESINPAGO;
END;
18. Crear un cursor para ver todos los clientes que no hayan hecho pagos. Hazlo con un for.

DECLARE
CURSOR CURSOR_CLIENTESINPAGO IS
SELECT NOMBRE_CLIENTE
FROM CLIENTE C
WHERE NOT EXISTS (SELECT CODIGO_CLIENTE
FROM PAGO
WHERE CODIGO_CLIENTE =C.CODIGO_CLIENTE);
BEGIN
FOR
REGISTRO IN CURSOR_CLIENTESINPAGO LOOP
DBMS_OUTPUT.PUT_LINE(REGISTRO.NOMBRE_CLIENTE);
END LOOP;
END;
19.- Crear un cursor para ver todos los productos pedidos en un pedido. Muestra la cantidad
también

CREATE OR REPLACE PROCEDURE MOSTRARPRODUCTOPEDIDO (P_CODIGOPEDIDO PEDIDO.


CODIGO_PEDIDO%TYPE)
AS
CURSOR CURSOR_PRODUCTOPEDIDO IS
SELECT P.NOMBRE, D.CANTIDAD
FROM PRODUCTO P, DETALLE_PEDIDO D
WHERE P.CODIGO_PRODUCTO=D.CODIGO_PRODUCTO
AND D.CODIGO_PEDIDO =P_CODIGOPEDIDO;
BEGIN
FOR REGISTRO IN CURSOR_PRODUCTOPEDIDO LOOP
DBMS_OUTPUT.PUT_LINE(REGISTRO.NOMBRE || ' '||REGISTRO.CANTIDAD);
END LOOP;
END;

DECLARE
P_CODIGOPEDIDO PEDIDO.CODIGO_PEDIDO%TYPE:=&CODIGO;
BEGIN

pág. 9
Desarrollo de Aplicaciones Multiplataforma – Bases de datos

MOSTRARPRODUCTOPEDIDO(P_CODIGOPEDIDO);
END;
20.- Crear un cursor para ver todos los empleados de un jefe

CREATE OR REPLACE PROCEDURE MOSTRAREMPLPEADOSJEFE(P_CODIGOJEFE


EMPLEADO.CODIGO_JEFE%TYPE) AS CURSOR CURSOR_EMPLEADOJEFE IS SELECT NOMBRE||' '||
APELLIDO1||' '||APELLIDO2 AS "NOMBRE COMPLETO" FROM EMPLEADO WHERE
CODIGO_JEFE=P_CODIGOJEFE;
V_NOMBREJEFE VARCHAR2(300); BEGIN SELECT NOMBRE||' '||APELLIDO1||' '||APELLIDO2
INTO V_NOMBREJEFE FROM EMPLEADO WHERE CODIGO_EMPLEADO=P_CODIGOJEFE;
dbms_output.put_line('El jefe con nombre: '||v_nombrejefe|| ' tiene como empleados a: '); FOR
REGISTRO IN CURSOR_EMPLEADOJEFE LOOP dbms_output.put_line(REGISTRO."NOMBRE
COMPLETO"); END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No se han encontrado ningun registro'); WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido un error'); END; /
DECLARE P_CODIGOJEFE EMPLEADO.CODIGO_JEFE%TYPE :=&CODIGOJEFE; BEGIN
MOSTRAREMPLPEADOSJEFE(P_CODIGOJEFE); END;
21.- Crea un TRIGGER para actualizar la tabla PRODUCTOS, cuando se haga un INSERT en la
tabla DETALLEPEDIDOS, actualizando el stock de los productos.

CREATE OR REPLACE TRIGGER PORDUCTOSACTUALIZADOS


AFTER INSERT ON DETALLE_PEDIDO FOR EACH ROW
BEGIN
UPDATE PRODUCTO
SET CANTIDAD_EN_STOCK = CANTIDAD_EN_STOCK - :NEW.CANTIDAD
WHERE CODIGO_PRODUCTO = :NEW.CODIGO_PRODUCTO;
END;

pág. 10

También podría gustarte