2 Day Developer > Using Procedures, Functions... > Managing Packages > Creating Packages With the ...
Creating Packages With the SQL CREATE PACKAGE Statement |
Previous |
Next |
To create packages, use the SQL CREATE
PACKAGE
and CREATE
PACKAGE
BODY
statements. You can use these SQL statements in the SQL Commands page, the Script Editor page, the Object Browser page, or SQL Command Line (SQL*Plus). In Example: Creating a Package Specification and Example: Creating a Package Body, the OR
REPLACE
option is used so that you can update an existing package without having to first drop the package.
In Example: Creating a Package Specification, the emp_actions
package specification contains two procedures that update the employees
table and one function that provides information. The package specification provides the declaration of the subprograms. The package body provides the contents of the subprograms.
Creating a Package Specification
CREATE OR REPLACE PACKAGE emp_actions AS -- package specification PROCEDURE hire_employee (lastname VARCHAR2, firstname VARCHAR2, email VARCHAR2, phoneno VARCHAR2, hiredate DATE, jobid VARCHAR2, sal NUMBER, commpct NUMBER, mgrid NUMBER, deptid NUMBER); PROCEDURE remove_employee (empid NUMBER); FUNCTION emp_sal_ranking (empid NUMBER) RETURN NUMBER; END emp_actions; /
In Example: Creating a Package Body, the emp_actions
package body is created. The package body provides the contents of the subprograms in the package specification.
Creating a Package Body
CREATE OR REPLACE PACKAGE BODY emp_actions AS -- package body -- code for procedure hire_employee, which adds a new employee PROCEDURE hire_employee (lastname VARCHAR2, firstname VARCHAR2, email VARCHAR2, phoneno VARCHAR2, hiredate DATE, jobid VARCHAR2, sal NUMBER, commpct NUMBER, mgrid NUMBER, deptid NUMBER) IS min_sal employees.salary%TYPE; -- variable to hold minimum salary for jobid max_sal employees.salary%TYPE; -- variable to hold maximum salary for jobid seq_value NUMBER; -- variable to hold next sequence value BEGIN -- get the next sequence number in the employees_seq sequence SELECT employees_seq.NEXTVAL INTO seq_value FROM DUAL; -- use the next sequence number for the new employee_id INSERT INTO employees VALUES (seq_value, lastname, firstname, email, phoneno, hiredate, jobid, sal, commpct, mgrid, deptid); SELECT min_salary INTO min_sal FROM jobs WHERE job_id = jobid; SELECT max_salary INTO max_sal FROM jobs WHERE job_id = jobid; IF sal > max_sal THEN DBMS_OUTPUT.PUT_LINE('Warning: ' || TO_CHAR(sal) || ' is greater than the maximum salary ' || TO_CHAR(max_sal) || ' for the job classification ' || jobid ); ELSIF sal < min_sal THEN DBMS_OUTPUT.PUT_LINE('Warning: ' || TO_CHAR(sal) || ' is less than the minimum salary ' || TO_CHAR(min_sal) || ' for the job classification ' || jobid ); END IF; END hire_employee; -- code for procedure remove_employee, which removes an existing employee PROCEDURE remove_employee (empid NUMBER) IS firstname employees.first_name%TYPE; lastname employees.last_name%TYPE; BEGIN SELECT first_name, last_name INTO firstname, lastname FROM employees WHERE employee_id = empid; DELETE FROM employees WHERE employee_id = empid; DBMS_OUTPUT.PUT_LINE('Employee: ' || TO_CHAR(empid) || ', ' || firstname || ', ' || lastname || ' has been deleted.'); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Employee ID: ' || TO_CHAR(empid) || ' not found.'); END remove_employee; -- code for function emp_sal_ranking, which calculates the salary ranking of the -- employee based on the minimum and maximum salaries for the job category FUNCTION emp_sal_ranking (empid NUMBER) RETURN NUMBER IS minsal employees.salary%TYPE; -- declare a variable same as salary maxsal employees.salary%TYPE; -- declare a variable same as salary jobid employees.job_id%TYPE; -- declare a variable same as job_id sal employees.salary%TYPE; -- declare a variable same as salary BEGIN -- retrieve the jobid and salary for the specific employee ID SELECT job_id, salary INTO jobid, sal FROM employees WHERE employee_id = empid; -- retrieve the minimum and maximum salaries for the job ID SELECT min_salary, max_salary INTO minsal, maxsal FROM jobs WHERE job_id = jobid; -- return the ranking as a decimal, based on the following calculation RETURN ((sal - minsal)/(maxsal - minsal)); END emp_sal_ranking; END emp_actions; / -- the following BEGIN..END block calls, or executes, the emp_sal_ranking -- function in the emp_actions package with an argument value DECLARE empid NUMBER := 163; -- use a test value for the employee_id BEGIN DBMS_OUTPUT.put_line('The salary ranking for employee ' || empid || ' is: ' || ROUND(emp_actions.emp_sal_ranking(empid),2) ); END; /
The output of the PL/SQL block is similar to:
The salary ranking for employee 163 is: .58
Note that the function result for employee 163 is different from the result for Example: Creating a Stored Function That Returns a Number. While the functions have the same function name (emp_sal_ranking
), they are not the same function. The function in the package is identified by the package name prefix, as in emp_actions.emp_sal_ranking
.
For methods on calling subprograms in a package, see "Calling a Subprogram in a Package".