1.概述
包用于将相关的对象组合在一起,一个任务,需要多个函数或者过程协同才能完成,这时,可以这些函数和存储过程都放在一个包下,方便函数和存储过程的管理,提高程序的性能,在第一次用的时候,会全部读入内存,下次用直接从内存取,加强模块化。
包分为两部分:
1.包头(类似java接口)
包的规范,只包含了函数或存储过程的说明部分
创建包头语法:
create [or replace] package 包名 is|as
--函数定义
function 函数名 [(参数列表)] return 返回类型;
--存储过程定义
procedure 存储过程名 [(参数列表)];
end [包名];
2.包体(类似java实现类)
实现包头里定义的规范
创建包体语法:
create [or replace] package body 包名 is|as
--函数实现
function 函数名 [(参数列表)] return 返回类型 is|as
函数实现内容
--存储过程实现
procedure 存储过程名 [(参数列表)] is|as
存储过程实现内容
end [包名];
2.实战演练
-- 建立包
create or replace package emp_pkg is
TYPE t_ref_cursor is REF CURSOR;
FUNCTION get_emp_ref_cussor RETURN t_ref_cursor;
PROCEDURE update_emp_sal(
e_empno IN emp.empno%type,
e_sal number
);
end emp_pkg;
-- 建立包体
create or replace package body emp_pkg is
FUNCTION get_emp_ref_cussor RETURN t_ref_cursor IS
v_emp_ref_cursor t_ref_cursor;
BEGIN
OPEN v_emp_ref_cursor FOR
SELECT empno, ename, sal
FROM emp;
RETURN v_emp_ref_cursor;
END get_emp_ref_cussor;
PROCEDURE update_emp_sal(
e_empno IN emp.empno%type,
e_sal IN NUMBER
) AS
BEGIN
UPDATE emp SET SAL = SAL/e_sal WHERE empno = e_empno;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLERRM);
ROLLBACK;
END update_emp_sal;
END emp_pkg;
2.1 调度包中函数
select emp_pkg.get_emp_ref_cussor from dual;
输出结果截图:
2.2 调度包中的过程
CALL emp_pkg.update_emp_sal(7369, 10000)