SQL> CREATE OR REPLACE PACKAGE hr.emp_admin AUTHID DEFINER AS 2 TYPE EmpRecTyp IS RECORD (emp_id NUMBER, sal NUMBER); 3 CURSOR desc_salary RETURN EmpRecTyp; 4 invalid_salary EXCEPTION; 5 6 PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER); 7 END emp_admin; 8 / Package created. SQL> SQL> CREATE OR REPLACE PACKAGE BODY hr.emp_admin AS 2 number_hired NUMBER; 3 4 CURSOR desc_salary RETURN EmpRecTyp IS 5 SELECT employee_id, salary 6 FROM employees 7 ORDER BY salary DESC; 8 9 FUNCTION sal_ok ( 10 jobid VARCHAR2, 11 sal NUMBER 12 ) RETURN BOOLEAN 13 IS 14 min_sal NUMBER; 15 max_sal NUMBER; 16 BEGIN 17 SELECT MIN(salary), MAX(salary) 18 INTO min_sal, max_sal 19 FROM employees 20 WHERE job_id = jobid; 21 22 RETURN (sal >= min_sal) AND (sal <= max_sal); 23 END sal_ok; 24 25 PROCEDURE raise_salary ( 26 emp_id NUMBER, 27 amount NUMBER 28 ) 29 IS 30 sal NUMBER(8,2); 31 jobid VARCHAR2(10); 32 BEGIN 33 SELECT job_id, salary INTO jobid, sal 34 FROM employees 35 WHERE employee_id = emp_id; 36 37 IF sal_ok(jobid, sal + amount) THEN -- Invoke private function 38 UPDATE employees 39 SET salary = salary + amount 40 WHERE employee_id = emp_id; 41 COMMIT; 42 ELSE 43 RAISE invalid_salary; 44 END IF; 45 EXCEPTION 46 WHEN invalid_salary THEN 47 DBMS_OUTPUT.PUT_LINE ('The salary is out of the specified range.'); 48 END raise_salary; 49 50 END emp_admin; 51 / Package body created. SQL>