BASES DE DATOS II
Prácticas completas PL/SQL 12c
1. Introducción
x Este documento agrupa todos los ejemplos y prácticas que se hacen durante el
curso.
x Están los enunciados y al final de cada capítulo se encuentran las soluciones,
x En el curso, en cada capítulo dispones del código fuente de cada vídeo, para
que podáis copiarlo con tranquilidad. Está en Recursos disponibles.
x Las tablas que vamos a usar pertenecen al usuario HR, que es el usuario de
ejemplo de Oracle del que hemos creado en la conexión que se usa durante el
curso.
x Básicamente usaremos las siguientes:
o EMPLOYEES: tabla de empleados
o DEPARTMENTS: contiene lo departamentos
o REGIONS: contiene las regiones
o JOBS: contiene los tipos de trabajos
o COUNTRIES: contiene los paises
x En las PRÁCTICAS tienes un fichero asociado con la solución
x Cualquier duda que tengas no dudes en pedir ayuda
1
BASES DE DATOS II
PRÁCTICAS CON CURSORES
x 1-Hacer un programa que tenga un cursor que vaya visualizando los salarios de
los empleados. Si en el cursor aparece el jefe (Steven King) se debe generar un
RAISE_APPLICATION_ERROR indicando que el sueldo del jefe no se puede
ver.
x 2-Hacemos un bloque con dos cursores. (Esto se puede hacer fácilmente con una
sola SELECT pero vamos a hacerlo de esta manera para probar parámetros en
cursores)
o El primero de empleados
o El
2
BASES DE DATOS II
EXECUTE visualizar(60,v_conteo);
DBMS_OUTPUT.PUT_LINE(visualizar.v_conteo);
DECLARE
x NUMBER;
BEGIN
visualizar(60,x);
DBMS_OUTPUT.PUT_LINE(x);
END;
/
x Práctica 3
CREATE OR REPLACE PROCEDURE formateo_cuenta (numero IN OUT
VARCHAR2)
IS
guardar1 VARCHAR2(20);
guardar2 VARCHAR2(20);
guardar3 VARCHAR2(20);
guardar4 VARCHAR2(20);
BEGIN
guardar1:=substr(numero,1,4);
guardar2:=substr(numero,5,4);
guardar3:=substr(numero,9,2);
guardar4:=substr(numero,10);
numero:=guardar1 || '-' || guardar2 || '-' || guardar3 || '-' || guardar4;
END;
/
DECLARE
x varchar2(30):='15210457901111111111';
BEGIN
formateo_cuenta(x);
dbms_output.put_line(x);
END;
6
BASES DE DATOS II
3. PRACTICA DE FUNCIONES
x 1-Crear una función que tenga como parámetro un número de departamento y
que devuelve la suma de los salarios de dicho departamento. La imprimimos por
pantalla.
o Si el departamento no existe debemos generar una excepción con dicho
mensaje
x 2-Modificar el programa anterior para incluir un parámetro de tipo OUT por el
que vaya el número de empleados afectados por la query. Debe ser visualizada
en el programa que llama a la función. De esta forma vemos que se puede usar
este tipo de parámetros también en una función
x 3-Crear una función llamada CREAR_REGION, donde se pase un nombre de
región que debe ser insertada en la tabla REGIONS y que devuelva un número.
o De forma automática debe calcular el código de región más alto, añadir 1
e insertar un registro con el nuevo número y l41.5mNrs0-4(4(n e)4(n una)] TJ4T11 0 0 1 15
7
BASES DE DATOS II
CREATE OR REPLACE PACKAGE BODY regiones IS
--FUNCIÓN EXISTE_REGION
FUNCTION existe_region ( id NUMBER,nombre VARCHAR2 ) RETURN
BOOLEAN IS
CURSOR c1 IS
SELECT
region_name,
region_id
FROM
regions;
y VARCHAR2(20);
BEGIN
FOR i IN c1 LOOP
IF
i.region_name = nombre AND i.region_id = id
THEN
RETURN true;
END IF;
END LOOP;
RETURN false;
END;
PROCEDURE alta_region ( codigo NUMBER,nombre VARCHAR2 ) IS
devuelto BOOLEAN;
BEGIN
devuelto := existe_region(codigo,nombre);
IF
devuelto = false
THEN
INSERT INTO regions ( region_id,region_name ) VALUES ( codigo,nombre );
dbms_output.put_line('Inserción correcta');
ELSE
dbms_output.put_line('La región ya existe.');
END IF;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('La ID YA EXISTE (duplicada)');
END;
--PROCEDURE BAJA_REGION
PROCEDURE baja_region ( id NUMBER ) IS
devuelto BOOLEAN;
otro VARCHAR2(20);
BEGIN
SELECT
region_name
INTO
otro
FROM
regions
WHERE
region_id = id;
devuelto := existe_region(id,otro);
IF
devuelto = true
THEN
11
BASES DE DATOS II
DELETE FROM regions WHERE
region_id = id;
dbms_output.put_line('Región con ID ' || id || ' borrada');
END IF;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('La región no existe!');
END;
--PROCEDURE MOD_REGION
PROCEDURE mod_region ( id NUMBER,nombre VARCHAR2 ) IS
devuelto BOOLEAN;
BEGIN
devuelto := existe_region(id,nombre);
IF
devuelto = true
THEN
UPDATE regions
SET
region_name = nombre
WHERE
region_id = id;
dbms_output.put_line('La región ha sido actualizada.');
ELSE
dbms_output.put_line('La región no existe.');
END IF;
END;
--FUNCIÓN CON_REGIOM
FUNCTION con_regiom ( codigo NUMBER ) RETURN VARCHAR2 IS
nombre_devolver VARCHAR2(20);
BEGIN
SELECT
region_name
INTO
nombre_devolver
FROM
regions
WHERE
region_id = codigo;
RETURN nombre_devolver;
END;
END regiones;
/
EXECUTE mod_region(7,'pikachutotal');
EXECUTE regiones.baja_region(10);
EXECUTE regiones.alta_region(10,'Prueba');
SELECT
*
FROM
regions;
DELETE FROM regions WHERE
region_id > 4;
ROLLBACK;
12
BASES DE DATOS II
BASES DE DATOS II
6. Práctica completa
18.1. Crear las tablas y datos necesarios
x creación_ddl.sql
se encuentra en los recursos del capítulo o bien podéis copiarlo y pegarlo de este
documento
FACTURAS
LINEAS_FACTURA
LOG_CONTROL
PRODUCTOS
x Las columnas de cada tabla con la siguientes:
COD_FACTURA NUMBER
FECHA DATE
DESCRIPCIÓN VARCHAR2(100)
x Clave primaria: COD_FACTURA
COD_PRODUCTO NUMBER
COD_FACTURA NUMBER
PVP NUMBER
UNIDADES NUMBER
FECHA DATE
x Clave Primaria: COD_FACTURA+COD_PRODUCTO
x Referencia a la tabla FACTURAS y a la tabla PRODUCTOS
COD_PRODUCTO NUMBER
NOMBRE_PRODUCTO VARCHAR2(100)
PVP NUMBER
17
Apasoft Training
TOTAL_VENDIDO NUMBER
x Clave primaria: COD_PRODUCTO
NUMBER
COD_EMPLEADO
DATE
FECHA
VARCHAR2(50)
TABLA_AFECTADA
COD_OPERACÍON CHAR(1)
x La columna COD_OPERACION debe valer:(I, U, D ˘ INSERT, UPDATE
,DELETE)
x Los scripts son los siguientes:
--------------------------------------------------------
-- DDL for Table LINEAS_FACTURA
--------------------------------------------------------
CREATE TABLE "HR"."LINEAS_FACTURA"
18
Apasoft Training
REM INSERTING into HR.PRODUCTOS
SET DEFINE OFF;
Insert into HR.PRODUCTOS
(COD_PRODUCTO,NOMBRE_PRODUCTO,PVP,TOTAL_VENDIDOS) values
('1','TORNILLO','1',null);
Insert into HR.PRODUCTOS
(COD_PRODUCTO,NOMBRE_PRODUCTO,PVP,TOTAL_VENDIDOS) values
('2','TUERCA','5',null);
Insert into HR.PRODUCTOS
(COD_PRODUCTO,NOMBRE_PRODUCTO,PVP,TOTAL_VENDIDOS) values
('3','ARANDELA','4',null);
Insert into HR.PRODUCTOS
(COD_PRODUCTO,NOMBRE_PRODUCTO,PVP,TOTAL_VENDIDOS) values
('4','MARTILLO','40',null);
Insert into HR.PRODUCTOS
(COD_PRODUCTO,NOMBRE_PRODUCTO,PVP,TOTAL_VENDIDOS) values
('5','CLAVO','1',null);
21
Apasoft Training
www.apasoft-training.com
[email protected] 22