PLSQL Esquema HR
PLSQL Esquema HR
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE('PEPE');
DBMS_OUTPUT.PUT_LINE('RAMÍREZ');
DBMS_OUTPUT.PUT_LINE('PEPE'||' '||'RAMÍREZ');
END;
/
A/ BEGIN
END;
B/ DECLARE x INTEGER(10);
END;
C/ DECLARE
BEGIN
END;
D/ DECLARE
X INTEGER(10);
BEGIN
DBMS_OUTPUT.PUT_LINE(x);
END;
La solución es el 4, ya que es el único que tiene todos los
componentes. Un bloque BEGIN END debe tener al menos un
comando.
P á g i n a 1 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
DECLARE
A NUMBER;
B NUMBER;
RESULTADO NUMBER;
BEGIN
A:=10;
B:=20;
RESULTADO:=A+B;
DBMS_OUTPUT.PUT_LINE('RESULTADO:'||RESULTADO);
END;
/
4-Modificar el ejemplo anterior y ponemos null como valor de una de las variables. ¿Qué
resultado arroja? Volvemos a ponerla un valor numérico
DECLARE
A NUMBER;
B NUMBER;
RESULTADO NUMBER;
BEGIN
A:=10;
B:=NULL;
RESULTADO:=A+B;
DBMS_OUTPUT.PUT_LINE('RESULTADO:'||RESULTADO);
END;
/
5-Añadir una constante al ejercicio. Sumamos las 2 variables y las constantes. Intentar
modificar la constante. ¿Es posible?
P á g i n a 2 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
B NUMBER;
C CONSTANT NUMBER :=40;
RESULTADO NUMBER;
BEGIN
A:=10;
B:=20;
RESULTADO:=A+B+C;
DBMS_OUTPUT.PUT_LINE('RESULTADO:'||RESULTADO);
END;
/
6-Crear un bloque anónimo que tenga una variable de tipo VARCHAR2 con nuestro nom-
bre, otra numérica con la edad y una tercera con la fecha de nacimiento. Visualizarlas
por separado y luego intentar concatenarlas. ¿es posible?
P á g i n a 3 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
DECLARE
impuesto CONSTANT NUMBER := 21;
precio NUMBER(5, 2);
resultado precio%TYPE;
BEGIN
precio := 100.50;
resultado := precio * impuesto / 100;
dbms_output.put_line(resultado);
END;
SET SERVEROUTPUT ON
DECLARE X NUMBER:=10;
BEGIN
DBMS_OUTPUT.PUT_LINE(X);
DECLARE X NUMBER:=20;
BEGIN
DBMS_OUTPUT.PUT_LINE(X);
END;
DBMS_OUTPUT.PUT_LINE(X);
END;
/
Solución:10 20 10
P á g i n a 4 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
Sol:
Falla porque la variable X está solo en el bloque anidado y
por tanto no puede ser vista desde el bloque principal.
P á g i n a 5 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
INICIALES:=SUBSTR(NOMBRE,1,1)||'.'||SUBSTR(APELLIDO1,1,1)||
'.'||SUBSTR(APELLIDO2,1,1)||'.';
DBMS_OUTPUT.PUT_LINE(UPPER(INICIALES));
END;
/
Práctica 2- Averiguar el nombre del día que naciste, por ejemplo "Martes"
DECLARE
FEC_NAC DATE;
DIA_SEMANA VARCHAR2(100);
BEGIN
FEC_NAC:=TO_DATE('10/10/1965');
DIA_SEMANA:=TO_CHAR(FEC_NAC,'DAY');
DBMS_OUTPUT.PUT_LINE(DIA_SEMANA);
P á g i n a 6 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
END;
/
Práctica Comando IF
PRÁCTICA 1
Debemos hacer un bloque PL/SQL anónimo, donde declaramos una variable NUMBER y
la ponemos algún valor.
Debe indicar si el número es PAR o IMPAR. Es decir, debemos usar IF…. ELSE para hacer
el ejercicio.
Como pista, recuerda que hay una función en SQL denominada MOD, que permite
averiguar el resto de una división.
Por ejemplo, MOD (10,4) nos devuelve el resto de dividir 10 por 4.
DECLARE
VALOR NUMBER;
RESULTADO NUMBER;
BEGIN
VALOR :=10;
RESULTADO := MOD(VALOR, 2);
IF RESULTADO = 0 THEN
DBMS_OUTPUT.PUT_LINE('PAR');
ELSE
DBMS_OUTPUT.PUT_LINE('IMPAR');
END IF;
END;
/
PRÁCTICA 2
Crear una variable CHAR(1) denominada TIPO_PRODUCTO.
Poner un valor entre "A" Y "E".
Visualizar el siguiente resultado según el tipo de producto.
P á g i n a 7 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
P á g i n a 8 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
Luego hacermos un CASE para que nos pinte un mensaje del estilo:.
DECLARE
USUARIO VARCHAR2(30);
BEGIN
USUARIO:=USER;
CASE USUARIO
WHEN 'SYS' THEN DBMS_OUTPUT.PUT_LINE('ERES
SUPERADMINISTRADOR');
WHEN 'SYSTEM' THEN DBMS_OUTPUT.PUT_LINE('ERES
ADMINISTRADOR NORMAL');
WHEN 'HR' THEN DBMS_OUTPUT.PUT_LINE('ERES DE RECURSOS
HUMANOS');
ELSE DBMS_OUTPUT.PUT_LINE('USUARIO NO AUTORIZADO');
END CASE;
END;
LOOP
EXIT WHEN X=11;
DBMS_OUTPUT.PUT_LINE('Tabla de multiplicar del :'||x);
LOOP
EXIT WHEN Z=11;
DBMS_OUTPUT.PUT_LINE(X*Z);
Z:=Z+1;
END LOOP;
Z:=0;
X:=X+1;
END LOOP;
END;
/
DECLARE
X NUMBER;
Z NUMBER;
BEGIN
X:=1;
Z:=1;
WHILE X<11 LOOP
DBMS_OUTPUT.PUT_LINE('Tabla de multiplicar del :'||x);
WHILE Z<11 LOOP
DBMS_OUTPUT.PUT_LINE(X*Z);
Z:=Z+1;
END LOOP;
Z:=0;
X:=X+1;
END LOOP;
END;
/
BEGIN
P á g i n a 10 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
FRASE_AL_REVES:=FRASE_AL_REVES||SUBSTR(FRASE,LIMITE,1);
LIMITE:=LIMITE-1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(FRASE_AL_REVES);
END;
/
Práctica 3
Usando la práctica anterior, si en el texto aparece el carácter "x" debe salir del bucle. Es
igual en mayúsculas o minúsculas. Debemos usar la cláusula EXIT.
DECLARE
FRASE VARCHAR2(100);
LIMITE NUMBER;
P á g i n a 11 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
CONTADOR NUMBER;
FRASE_AL_REVES VARCHAR2(100);
BEGIN
FRASE:='ESTO ES UNA PRUEBA DE XRSE';
LIMITE:=LENGTH(FRASE);
WHILE LIMITE>0 LOOP
EXIT WHEN UPPER((SUBSTR(FRASE,LIMITE,1)))='X';
FRASE_AL_REVES:=FRASE_AL_REVES||SUBSTR(FRASE,LIMITE,1);
LIMITE:=LIMITE-1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(FRASE_AL_REVES);
END;
/
Práctica 4
Debemos crear una variable llamada NOMBRE
Debemos pintar tantos asteriscos como letras tenga el nombre. Usamos un bucle FOR
Por ejemplo, Alberto --> *******
DECLARE
NOMBRE VARCHAR2(100);
ASTERISCOS VARCHAR2(100);
BEGIN
NOMBRE:='ALBERTO';
FOR I IN 1..LENGTH(NOMBRE) LOOP
ASTERISCOS:=ASTERISCOS||'*';
END LOOP;
DBMS_OUTPUT.PUT_LINE(NOMBRE ||'-->'||ASTERISCOS);
END;
/
P á g i n a 12 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
Práctica 5
Creamos dos variables numéricas, "inicio y fin"
Las inicializamos con algún valor:
Debemos sacar los números que sean múltiplos de 4 de ese rango.
DECLARE
INICIO NUMBER;
FINAL NUMBER;
BEGIN
INICIO:=10;
FINAL:=200;
FOR I IN INICIO..FINAL LOOP
IF MOD(I,4)=0 THEN
DBMS_OUTPUT.PUT_LINE(I);
END IF;
END LOOP;
END;
/
P á g i n a 13 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
END;
PRÁCTICA2
Visualizar el tipo de trabajo del empleado número 100
set serveroutput on
DECLARE
TIPO_TRABAJO employees.JOB_ID%TYPE;
BEGIN
select job_id into tipo_trabajo from employees
where employee_id=100;
dbms_output.put_line('El tipo de trabajo del
empleado 100 es:'||tipo_trabajo);
end;
/
PRÁCTICA 3
Crear una variable de tipo DEPARTMENT_ID y ponerla algún valor, por ejemplo 10.
Visualizar el nombre de ese departamento y el número de empleados que tiene,
poniendo. Crear dos variables para albergar los valores.
set serveroutput on
DECLARE
COD_DEPARTAMENTO DEPARTMENTS.DEPARTMENT_ID%TYPE:=10;
NOM_DEPARTAMENTO DEPARTMENTS.DEPARTMENT_NAME%TYPE;
NUM_EMPLE NUMBER;
BEGIN
--RECUPERAR EL NOMBRE DEL DEPARTAMENTO
SELECT DEPARTMENT_NAME INTO NOM_DEPARTAMENTO FROM
DEPARTMENTS WHERE DEPARTMENT_ID=COD_DEPARTAMENTO;
--RECUPERAR EL NÚMERO DE EMLEADOS DEL DEPARTAMENTO
SELECT COUNT(*) INTO NUM_EMPLE FROM EMPLOYEES WHERE
DEPARTMENT_ID=COD_DEPARTAMENTO;
DBMS_OUTPUT.PUT_LINE('EL DEPARTAMENTO
'||NOM_DEPARTAMENTO||' TIENE '||NUM_EMPLE||' EMPLEADOS');
END;
/
P á g i n a 14 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
PRÁCTICA 4
Mediante dos consultas recuperar el salario máximo y el salario mínimo de la empresa e
indicar su diferencia
DECLARE
MAXIMO NUMBER;
MINIMO NUMBER;
DIFERENCIA NUMBER;
BEGIN
SELECT MAX(SALARY),MIN(SALARY) INTO MAXIMO,MINIMO
FROM EMPLOYEES;
DBMS_OUTPUT.PUT_LINE('EL SALARIO MÁXIMO ES:'||MAXIMO);
DBMS_OUTPUT.PUT_LINE('EL SALARIO MÍNIMO ES:'||MINIMO);
DIFERENCIA:=MAXIMO-MINIMO;
DBMS_OUTPUT.PUT_LINE('LA DIFERENCIA ES:'||DIFERENCIA);
END;
/
P á g i n a 15 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
DECLARE
nombre_empleado employees.first_name%TYPE;
BEGIN
SELECT first_name INTO nombre_empleado FROM employees
P á g i n a 16 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
P á g i n a 17 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
WHERE
employee_id = 100;
salario:=salario/0;
dbms_output.put_line(salario);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('No existe el empleado.');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Empleado duplicado.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('CODIGO:'||SQLCODE);
DBMS_OUTPUT.PUT_LINE('MENSAJE:'||SQLERRM);
END;
/
4-El error -00001 es clave primaria duplicada. Aunque ya existe una predefinida
(DUP_VAL_ON_INDEX) vamos a crear una excepción no -predefinida que haga lo mismo.
o Vamos a usar la tabla REGIONS para hacerlo más fácil o Usamos PRAGMA
EXCEPTION_INIT y creamos una excepción denominada “duplicado”. Cuando se genere
ese error debemos pintar “Clave duplicada, intente otra”. o Insertamos una fila en la
tabla REGIONS que esté duplicada y vemos que se controla el error.
set serveroutput on
DECLARE
duplicado EXCEPTION;
PRAGMA EXCEPTION_INIT(duplicado,-00001);
BEGIN
INSERT INTO REGIONS VALUES (1,'PRUEBA');
COMMIT;
EXCEPTION
when duplicado then
dbms_output.put_line('Registro duplicado');
End;
P á g i n a 18 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
• En ese caso debe generar un texto indicando algo así como “Código no
permitido. Debe ser inferior a 200”
• Recordemos que las excepciones personalizadas deben dispararse de forma
manual con el RAISE.
SET SERVEROUTPUT ON
DECLARE
CONTROL_REGIONES EXCEPTION;
CODIGO NUMBER:=201;
BEGIN
if codigo > 200 then
raise control_regiones;
else
INSERT INTO REGIONS VALUES (CODIGO,'PRUEBA');
end if;
exception
when control_regiones then
dbms_output.put_line('El codigo debe ser inferior a 200');
when others then
dbms_output.put_line(SQLcode);
dbms_output.put_line(SQLERRM);
END;
/
P á g i n a 19 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
PRÁCTICAS DE COLECCIONES Y
RECORDS
Creamos un TYPE RECORD que tenga las siguientes columnas
NAME VARCHAR2(100),
SAL EMPLOYEES.SALARY%TYPE,
COD_DEPT EMPLOYEES.DEPARTMENT_ID%TYPE);
Creamos un TYPE TABLE basado en el RECORD anterior
Mediante un bucle cargamos en la colección los empleados. El campo NAME debe
contener FIRST_NAME y LAST_NAME concatenado.
Para cargar las filas y siguiendo un ejemplo parecido que hemos visto en el vídeo usamos
el EMPLOYEE_ID que va de 100 a 206
A partir de este momento y ya con la colección cargada, hacemos las siguientes
operaciones, usando métodos de la colección.
• Visualizamos toda la colección.
• Visualizamos el primer empleado.
• Visualizamos el último empleado.
• Visualizamos el número de empleados.
• Borramos los empleados que ganan menos de 7000 y visualizamos de nuevo la
colección.
• Volvemos a visualizar el número de empleados para ver cuantos se han borrado.
SET SERVEROUTPUT ON
DECLARE
TYPE EMPL_RECORD IS RECORD
(
NAME VARCHAR2(100),
SAL EMPLOYEES.SALARY%TYPE,
COD_DEPT EMPLOYEES.DEPARTMENT_ID%TYPE);
P á g i n a 20 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
EMPL EMPL_TABLE;
BEGIN
FOR I in 100..206 LOOP
SELECT FIRST_NAME||' '||LAST_NAME, SALARY, DEPARTMENT_ID
INTO EMPL(I) FROM EMPLOYEES
WHERE EMPLOYEE_ID=I;
END LOOP;
END;
P á g i n a 21 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
DECLARE
CURSOR C1
IS SELECT first_name,last_name,salary from EMPLOYEES;
BEGIN
for i IN C1
LOOP
IF i.first_name='Steven' AND i.last_name='King'
THEN
raise_application_error(-20300,'El salario del jefe no puede
ser visto');
ELSE
DBMS_OUTPUT.PUT_LINE(i.first_name ||' ' || i.last_name || ':
'|| i.salary || 'DLS');
END IF;
END LOOP;
END;
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).
• el primero de empleados
• El segundo de departamentos que tenga como parámetro el MANAGER_ID
• Por cada fila del primero, abrimos el segundo curso pasando el ID del MANAGER
• Debemos pintar el Nombre del departamento y el nombre del MANAGER_ID
• Si el empleado no es MANAGER de ningún departamento debemos poner “No
es jefe de nada”
SET SERVEROUTPUT ON
DECLARE
P á g i n a 22 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
DEPARTAMENTO DEPARTMENTS%ROWTYPE;
jefe DEPARTMENTS.MANAGER_ID%TYPE;
CURSOR C1 IS SELECT * FROM EMployees;
CURSOR C2(j DEPARTMENTS.MANAGER_ID%TYPE)
IS SELECT * FROM DEPARTMENTS WHERE MANAGER_ID=j;
begin
for EMPLEADO in c1 loop
open c2(EMPLEADO.employee_id) ;
FETCH C2 into departamento;
if c2%NOTFOUND then
DBMS_OUTPUT.PUT_LINE(EMPLEADO.FIRST_NAME ||' No es JEFE de
NADA');
ELSE
DBMS_OUTPUT.PUT_LINE(EMPLEADO.FIRST_NAME || 'ES JEFE DEL
DEPARTAMENTO '|| DEPARTAMENTO.DEPARTMENT_NAME);
END IF;
CLOSE C2;
END LOOP;
END;
3-Crear un cursor con parámetros que pasando el número de departamento visualice el
número de empleados de ese departamento.
SET SERVEROUTPUT ON
DECLARE
CODIGO DEPARTMENTS.DEPARTMENT_ID%TYPE;
CURSOR C1(COD DEPARTMENTS.DEPARTMENT_ID%TYPE ) IS SELECT
COUNT(*) FROM employeeS
WHERE DEPARTMENT_ID=COD;
NUM_EMPLE NUMBER;
BEGIN
CODIGO:=10;
OPEN C1(CODIGO);
FETCH C1 INTO NUM_EMPLE;
P á g i n a 23 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
5-Creamos un bloque que tenga un cursor para empleados. Debemos crearlo con FOR
UPDATE.
• Por cada fila recuperada, si el salario es mayor de 8000 incrementamos el salario
un 2%
• Si es menor de 800 lo hacemos en un 3%
• Debemos modificarlo con la cláusula CURRENT OF
• Comprobar que los salarios se han modificado correctamente.
SET SERVEROUTPUT ON
DECLARE
CURSOR C1 IS SELECT * FROM EMployees for update;
begin
for EMPLEADO IN C1 LOOP
IF EMPLEADO.SALARY > 8000 THEN
UPDATE EMPLOYEES SET SALARY=SALARY*1.02
WHERE CURRENT OF C1;
ELSE
UPDATE EMPLOYEES SET SALARY=SALARY*1.03
WHERE CURRENT OF C1;
END IF;
END LOOP;
P á g i n a 24 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
COMMIT;
END ;
P á g i n a 25 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
LOOP
DBMS_OUTPUT.PUT_LINE(i.first_name || ' ' || i.salary);
NUMERO:=NUMERO+1;
END LOOP;
END;
DECLARE
x NUMBER;
BEGIN
visualizar(60,x);
DBMS_OUTPUT.PUT_LINE('El número de empleados es:'||x);
END;
/
3- crear un bloque por el cual se de formato a un nº de cuenta suministrado por
completo, por ej , 11111111111111111111
• Formateado a: 1111-1111-11-1111111111
• Debemos usar un parámetro de tipo IN-OUT
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);
P á g i n a 26 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
DECLARE
x varchar2(30):='15210457901111111111';
BEGIN
formateo_cuenta(x);
dbms_output.put_line(x);
END;
P á g i n a 27 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
PRACTICA DE FUNCIONES
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.
--PROBAR LA FUNCIÓN
SET SERVEROUTPUT ON
DECLARE
SAL NUMBER;
DEPT NUMBER:=100;
BEGIN
SAL:=salarios_dept(DEPT);
P á g i n a 28 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
--PROBAR LA FUNCIÓN
set serveroutput on
declare
TOTAL_SAL NUMBER;
NUM_EMPLE NUMBER;
DEPT NUMBER:=110;
BEGIN
TOTAL_SAL:=salarios_dept1(DEPT,NUM_EMPLE);
P á g i n a 29 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
P á g i n a 30 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
--PROBAR LA FUNCIÓN
DECLARE
N_REGION NUMBER;
BEGIN
N_REGION:=crear_region('NORMANDIA');
DBMS_OUTPUT.PUT_LINE('EL NUMERO ASIGNADO ES:'||N_REGION);
END;
/
• PROCEDIMIENTOS:
- ALTA_REGION, con parámetro de código y nombre Región. Debe devolver un
error si la región ya existe. Inserta una nueva región en la tabla. Debe llamar a la función
EXISTE_REGION para controlarlo.
- BAJA_REGION, con parámetro de código de región y que debe borrar una región.
Debe generar un error si la región no existe, Debe llamar a la función EXISTE_REGION
para controlarlo
- MOD_REGION: se le pasa un código y el nuevo nombre de la región Debe modificar
el nombre de una región ya existente. Debe generar un error si la región no existe, Debe
llamar a la función EXISTE_REGION para controlarlo
• FUNCIONES
o CON_REGION. Se le pasa un código de región y devuelve el nombre
P á g i n a 31 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
P á g i n a 32 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
--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
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
P á g i n a 33 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
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;
2-Crear un paquete denominado NOMINA que tenga sobrecargado la función
CALCULAR_NOMINA de la siguiente forma:
P á g i n a 34 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
P á g i n a 35 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
--TERCERA FUNCION
FUNCTION calcular_nomina ( id NUMBER, porcentaje NUMBER,
tercero VARCHAR2 := 'V') RETURN NUMBER IS
salario_final NUMBER;
comision NUMBER;
salario NUMBER;
BEGIN
SELECT salary into salario from employees where
employee_id=id;
SELECT commission_pct into comision from employees where
employee_id=id;
salario_final := salario - ( salario * (porcentaje/100 )) +
(salario*comision);
RETURN salario_final;
END;
END NOMINA;
/
declare
x number;
BEGIN
x:=NOMINA.CALCULAR_NOMINA(150,'8');
DBMS_OUTPUT.PUT_LINE(x);
END;
/
P á g i n a 36 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
desc nomina;
3-Crear un TRIGGER BEFORE INSERT de tipo STATEMENT, de forma que cada vez que se
haga un INSERT en la tabla REGIONS guarde una fila en la tabla AUDITORIA con el usuario
y la fecha en la que se ha hecho el INSERT
4- Realizar otro trigger BEFORE UPDATE de la columna SALARY de tipo EACH ROW. Si la
modificación supone rebajar el salario el TRIGGER debe disparar un
RAISE_APPLICATION_FAILURE “no se puede bajar un salario”. Si el salario es mayor
debemos dejar el salario antiguo y el salario nuevo en la tabla AUDITORIA.
create or replace TRIGGER TRIGGER_salario
BEFORE UPDATE ON EMPLOYEES
FOR EACH ROW
BEGIN
IF :NEW.SALARY< :OLD.SALARY THEN
RAISE_APPLICATION_ERROR(-20000,'NO SE PUEDE BAJAR EL
SALARIO');
END IF;
IF :NEW.SALARY> :OLD.SALARY THEN
INSERT INTO AUDITORIA VALUES
(USER,SYSDATE,:OLD.SALARY,:NEW.SALARY);
END IF;
END;
P á g i n a 38 | 39
C/Maestro Pedro Pérez Abadía, 2
Instituto de Enseñanza 30100 ESPINARDO (MURCIA)
Región de Murcia Telf: 968 83 46 90
Secundaria
Consejería de Educación y 968 83 46 05
Fax: 968 83 46 07
Cultura José Planes e-mail: [email protected]
www.iesjoseplanes.es
EXCEPTION
WHEN NO_DATA_FOUND THEN
if :new.location_id is null then
:new.location_id:=1700;
end if;
if :new.manager_id is null then
:new.manager_id:=200;
end if;
END;
P á g i n a 39 | 39