Ejemplos de PL*SQL

Para poder trabajar con estos ejemplos deberás tener creadas las tablas de demostración. Para obtener el fichero que las crea automáticamente haz click aquí.

1.- En la tabla emp incrementar el salario el 10% a los empleados que tengan una comisión superior al 5% del salario.

BEGIN
UPDATE EMP
SET SAL=SAL+SAL*(10/100)
WHERE COMM>(SAL*5/100);
END;
/

2.- Añadir la columna total2 y en ella escribir la suma del salario y la comisión de los empleados con comisión distinta de 0.

ALTER TABLE EMP ADD(TOTAL2 NUMBER(7,2));
DECLARE
CURSOR CURSOR2 IS SELECT COMM,SAL FROM EMP
WHERE COMM IS NOT NULL AND COMM<>0 FOR UPDATE;

BEGIN
FOR REG IN CURSOR2 LOOP
UPDATE EMP
SET TOTAL2=SAL+COMM
WHERE CURRENT OF CURSOR2;
END LOOP;
END;
/

3.- Insertar un empleado en la tabla EMP. Su número será superior a los existentes y la fecha de incorporación a la empresa será la actual.

DECLARE
NUM_EMPLEADO EMP.EMPNO%TYPE;
FECHA EMP.HIREDATE%TYPE;
BEGIN
SELECT MAX(EMPNO) INTO NUM_EMPLEADO FROM EMP;
SELECT SYSDATE INTO FECHA FROM DUAL;
NUM_EMPLEADO:=NUM_EMPLEADO +1;
INSERT INTO EMP VALUES (NUM_EMPLEADO,'PEDRO','MATEMATIC',7839,FECHA,3000,NULL,20,NULL);
END;
/

4.- Realizar un procedimiento para borrar un empleado recibiendo como parámetro el número de empleado.

DECLARE
NUM_EMPLEADO EMP.EMPNO%TYPE;
MRW ROWID;
BEGIN
SELECT EMPNO,ROWID INTO NUM_EMPLEADO,MRW FROM EMP WHERE EMPNO=&EMPLEADO;
DELETE FROM EMP WHERE ROWID=MRW;
END;
/

UNDEFINE EMPLEADO;

5.- Realizar un procedimiento para modificar la localidad de un departamento. El procedimiento recibe como parámetros la localidad y el número de departamento.

DECLARE
LOCALIDAD DEPT.LOC%TYPE;
NUMERO DEPT.DEPTNO%TYPE;
R ROWID;
BEGIN
SELECT LOC,DEPTNO,ROWID INTO LOCALIDAD,NUMERO,R FROM DEPT WHERE DEPTNO=&&NUMERO;
UPDATE DEPT
SET LOC='&LOCALIDAD' WHERE ROWID=R;
END;
/

UNDEFINE NUMERO;
UNDEFINE LOCALIDAD;

6.- Realizar un procedimiento para cambiar la fecha por el número de año.

DECLARE
FECHA VARCHAR2(4);
CURSOR CURSOR1 IS SELECT TO_CHAR(HIREDATE,'YYYY') FROM EMP FOR UPDATE;
BEGIN
OPEN CURSOR1;
LOOP
FETCH CURSOR1 INTO FECHA;
EXIT WHEN CURSOR1%NOTFOUND;
UPDATE EMP
SET HIREDATE='FECHA' WHERE CURRENT OF CURSOR1;
END LOOP;
CLOSE CURSOR1;
END;
/

7.- Añadir un nuevo empleado en la tabla emp. El número de empleado será el del último + 10. La fecha la actual, el departamento el 40.

DECLARE
EMPLEADO EMP.EMPNO%TYPE;
FECHAA EMP.HIREDATE%TYPE;

PROCEDURE EJERCICIO_7_1(FECHA IN EMP.HIREDATE%TYPE,
NUMERO_EMP IN EMP.EMPNO%TYPE,DEPARTAMENTO IN EMP.DEPTNO%TYPE) IS
BEGIN
INSERT INTO EMP VALUES (NUMERO_EMP,'NOMBRE','JOB',NULL,FECHA,999,NULL,DEPARTAMENTO);
END EJERCICIO_7_1;

FUNCTION TRANSFORMACION1 RETURN NUMBER IS
RETORNO EMP.EMPNO%TYPE;
MAYOR_NUMERO EMP.EMPNO%TYPE;
BEGIN
SELECT MAX(EMPNO) INTO MAYOR_NUMERO FROM EMP;
RETORNO:=MAYOR_NUMERO+10;
RETURN(RETORNO);
END TRANSFORMACION1;
FUNCTION TRANSFORMACION2 RETURN DATE IS
RETORNO EMP.HIREDATE%TYPE;
BEGIN
RETORNO:=SYSDATE;
RETURN(RETORNO);
END TRANSFORMACION2;

BEGIN

EMPLEADO:=TRANSFORMACION1;
FECHAA:=TRANSFORMACION2;
EJERCICIO_7_1(FECHAA,EMPLEADO,40);
END;
/

8.- Sobre la tabla EMP insertar un nuevo 'SALESMAN'. Su número de empleado será consecutivo. Su departamento será el mismo que el de su jefe 'CLARK'.

DECLARE
EMPLEADO EMP.EMPNO%TYPE;
DEPARTAMENTO EMP.DEPTNO%TYPE;
MANAGER EMP.EMPNO%TYPE;

PROCEDURE EJERCICIO_7_2(NUMERO_EMP IN EMP.EMPNO%TYPE,DEPARTAMENTO_EMP IN EMP.DEPTNO%TYPE,
MANAGER_EMP IN EMP.EMPNO%TYPE)
IS
BEGIN
INSERT INTO EMP VALUES(NUMERO_EMP,'PEDRO','SALESMAN',MANAGER,'17/12/81',1500,NULL,DEPARTAMENTO);
END EJERCICIO_7_2;

FUNCTION TRANSFORMACION3 RETURN NUMBER IS
RETORNO EMP.EMPNO%TYPE;
MAYOR_NUMERO EMP.EMPNO%TYPE;
BEGIN
SELECT MAX(EMPNO) INTO MAYOR_NUMERO FROM EMP;
RETORNO:=MAYOR_NUMERO+1;
RETURN(RETORNO);
END TRANSFORMACION3;

FUNCTION TRANSFORMACION4 RETURN NUMBER IS
DEPARTAMENTO1 EMP.DEPTNO%TYPE;
BEGIN
SELECT DEPTNO INTO DEPARTAMENTO1 FROM EMP WHERE UPPER(ENAME)='CLARK';
RETURN(DEPARTAMENTO1);
END TRANSFORMACION4;

FUNCTION TRANSFORMACION5 RETURN NUMBER IS
MANAGER1 EMP.EMPNO%TYPE;
BEGIN
SELECT EMPNO INTO MANAGER1 FROM EMP WHERE UPPER(ENAME)='CLARK';
RETURN(MANAGER1);
END TRANSFORMACION5;

BEGIN
EMPLEADO:=TRANSFORMACION3;
DEPARTAMENTO:=TRANSFORMACION4;
MANAGER:=TRANSFORMACION5;
EJERCICIO_7_2 (EMPLEADO,DEPARTAMENTO,MANAGER);
END;
/

9.- Que encuentre el primer empleado que tiene un salario superior a 2000.

DECLARE
PROCEDURE ENCONTRAR IS
CURSOR C1 IS SELECT EMPNO,ENAME FROM EMP WHERE SAL>2000;
REGISTRO C1%ROWTYPE;

BEGIN
OPEN C1;
FETCH C1 INTO REGISTRO;
IF C1 %ROWCOUNT=1 THEN
DBMS_OUTPUT.PUT_LINE(REGISTRO.EMPNO || ' '||REGISTRO.ENAME);
ELSE
DBMS_OUTPUT.PUT_LINE('NO SE ENCONTRO');
END IF;
CLOSE C1;
END ENCONTRAR;

BEGIN
ENCONTRAR;
END;

10.- Listar todos los empleados que tienen un nombre de 5 letras.

DECLARE
PROCEDURE EJERCICIO_7_4 IS
CURSOR C1 IS SELECT ENAME,JOB,SAL,DEPTNO FROM EMP WHERE LENGTH(ENAME)=&long;
REGISTRO C1%ROWTYPE;

BEGIN
OPEN C1;
LOOP
FETCH C1 INTO REGISTRO;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (REGISTRO.ENAME ||' '||REGISTRO.JOB ||' '||REGISTRO.SAL||' '||REGISTRO.DEPTNO);
END LOOP;
CLOSE C1;
END EJERCICIO_7_4;
BEGIN
EJERCICIO_7_4;
END;
/

11.- Buscar todos los empleados que tienen un salario + comisión superior a 2000 y asignarles como nuevo salario esta suma. Sólo para los que tienen comisión.

DECLARE
PROCEDURE ACTUALIZAR IS
CURSOR C1 IS SELECT ENAME,SAL,COMM FROM EMP WHERE SAL+COMM>2000 FOR UPDATE;
REGISTRO C1%ROWTYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO REGISTRO;
EXIT WHEN C1%NOTFOUND;
UPDATE EMP
SET SAL=SAL+COMM WHERE CURRENT OF C1;
END LOOP;
CLOSE C1;
END ACTUALIZAR;

BEGIN
ACTUALIZAR;
END;
/

12.- Realizar un procedimiento que guarde en una vista el nombre y la fecha de alta de los empleados por nombre.

DECLARE
PROCEDURE GUARDAR IS
CURSOR CURSOR1 IS SELECT ENAME,HIREDATE FROM EMP ORDER BY ENAME ;
REGISTRO CURSOR1%ROWTYPE;

BEGIN
OPEN CURSOR1;
LOOP
FETCH CURSOR1 INTO REGISTRO;
EXIT WHEN CURSOR1%NOTFOUND;
INSERT INTO BORRARE6
VALUES (REGISTRO.ENAME,REGISTRO.HIREDATE);
END LOOP;
CLOSE CURSOR1;
END GUARDAR;

BEGIN
GUARDAR;

END;

13.- Realizar un procedimiento para crear una vista con el nombre de cada departmento y número de empleados que tiene.

CREATE OR REPLACE PROCEDURE DINAMICO (INSTRUCCION VARCHAR2) AS
cid INTEGER;
DUMMY INTEGER;
BEGIN
cid := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cid, INSTRUCCION, dbms_sql.v7);
DUMMY:=DBMS_SQL.EXECUTE(CID);
DBMS_SQL.CLOSE_CURSOR(cid);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(cid);
RAISE;
END DINAMICO;
/

EXECUTE DINAMICO('CREATE VIEW VISTA7 AS (SELECT COUNT(DISTINCT(ENAME)) N_EMP,DEPTNO FROM EMP GROUP BY DEPTNO)');

14.- Realizar un procedimiento para guardar el nombre y el número de empleado de los empleados cuyo apellido contenga una cadena. La cadena se le pasa al procedimiento.

DECLARE
--T EMP.ENAME%TYPE;
PROCEDURE BUSCAR718(CADENA IN EMP.ENAME%TYPE) IS
E EMP.EMPNO%TYPE;
P EMP.ENAME%TYPE;
BEGIN
SELECT EMPNO,ENAME INTO E,P FROM EMP WHERE P LIKE 'SMITH';
DBMS_OUTPUT.PUT_LINE(E || P);
END BUSCAR718;
BEGIN

BUSCAR718('SMITH');
END;

15.- Cómo borrar o crear una tabla utilizando PL*SQL.

DECLARE
PROCEDURE drop_table IS
cid INTEGER;
BEGIN
cid := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cid, 'DROP TABLE ' || 'EMP', dbms_sql.v7);
DBMS_SQL.CLOSE_CURSOR(cid);
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(cid);
RAISE;
END drop_table;

BEGIN
drop_table;
END;



VOLVER

A PROGRAMAR © 2002. All Rights Reserved.
Hosted by www.Geocities.ws

1