Para crear un paquete PL/SQL:
Una especificación de paquete establece qué objetos de paquete se pueden referenciar desde fuera del paquete; la especificación especifica rutinas y declara excepciones.
Un cuerpo de paquete contiene la implementación de todos los procedimientos y funciones que están declarados dentro de la especificación de paquete.
CREATE OR REPLACE PACKAGE emp_admin IS FUNCTION get_dept_name ( p_deptno NUMBER DEFAULT 10 ) RETURN VARCHAR2; FUNCTION update_emp_sal ( p_empno NUMBER, p_raise NUMBER ) RETURN NUMBER; PROCEDURE hire_emp ( p_empno NUMBER, p_ename VARCHAR2, p_job VARCHAR2, p_sal NUMBER, p_hiredate DATE DEFAULT sysdate, p_comm NUMBER DEFAULT 0, p_mgr NUMBER, p_deptno NUMBER DEFAULT 10 ); PROCEDURE fire_emp ( p_empno NUMBER
-- -- Cuerpo del paquete 'emp_admin'. -- CREATE OR REPLACE PACKAGE BODY emp_admin IS -- -- Función que consulta la tabla 'dept' de acuerdo con el número -- de departamento y devuelve el nombre del departamento -- correspondiente. -- FUNCTION get_dept_name ( p_deptno IN NUMBER DEFAULT 10 ) RETURN VARCHAR2 IS v_dname VARCHAR2(14); BEGIN SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; RETURN v_dname; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Número de departamento no válido ' || p_deptno); RETURN ''; END; -- -- Función que actualiza el salario de un empleado según el -- número de empleado y el incremento/reducción salarial -- como parámetros IN. Tras la finalización correcta, la -- función devuelve el nuevo salario actualizado. -- FUNCTION update_emp_sal ( p_empno IN NUMBER, p_raise IN NUMBER ) RETURN NUMBER IS v_sal NUMBER := 0; BEGIN SELECT sal INTO v_sal FROM emp WHERE empno = p_empno; v_sal := v_sal + p_raise; UPDATE emp SET sal = v_sal WHERE empno = p_empno; RETURN v_sal; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Empleado ' || p_empno || ' no encontrado'); RETURN -1; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Lo siguiente es SQLERRM:'); DBMS_OUTPUT.PUT_LINE(SQLERRM); DBMS_OUTPUT.PUT_LINE('Lo siguiente es SQLCODE:'); DBMS_OUTPUT.PUT_LINE(SQLCODE); RETURN -1; END; -- -- Procedimiento que inserta un nuevo registro de empleado en la tabla 'emp'. -- PROCEDURE hire_emp ( p_empno NUMBER, p_ename VARCHAR2, p_job VARCHAR2, p_sal NUMBER, p_hiredate DATE DEFAULT sysdate, p_comm NUMBER DEFAULT 0, p_mgr NUMBER, p_deptno NUMBER DEFAULT 10 ) AS BEGIN INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) VALUES(p_empno, p_ename, p_job, p_sal, p_hiredate, p_comm, p_mgr, p_deptno); END; -- -- Procedimiento que suprime un registro de empleado en la tabla -- 'emp' de acuerdo con el número de empleado. -- PROCEDURE fire_emp ( p_empno NUMBER ) AS BEGIN DELETE FROM emp WHERE empno = p_empno; END; END;
El nuevo paquete PL/SQL contendrá una especificación y un cuerpo.