程序包:
是对PL/SQL类型,过程,函数,游标,异常,变量,常量的封装。
包括两部分:规范和主体
规范:是程序包的公共接口,
主体:规范的实现,以及私有例程、数据和变量。
建立包的步骤:建立包的说明,在建立包的说明
建立包的说明语法:
CREATE OR REPLACE PACKAGE package_name
IS | AS
公用类型或变量常量的声明;
公用过程或函数的声明;
END package_name;
/
建立包的说明语法
CREATE OR REPLACE PACKAGE BODY package_name
IS | AS
私有类型或变量常量的声明;
公用过程或函数的实现;
END package_name
规范:
规范是程序包的接口,规范中定义的所有内容都可以由调用者使用(当然需要具有EXECUTE特权),比如规范中定义的过程函数可以被执行,类型可以被访问,变量可以被引用。
例子:使用两个过程PRINT_ENAME() 和PRINT_SAL(),定义称为EMPLOYEE_PKG的程序包。
CREATE OR REPLACE
PACKAGE employee_pkg as
Procedure print_ename(p_empno number);
Procedure print_sal(p_empno number);
End;
/
并没有为过程提供代码,只是定义了名称和参数。
这个时候如果试图使用这个包,会报错
exec employee_pkg.print_ename(1234);
主体:
程序包是过程,函数的具体实现部分,实现规范中定义的接口。
CREATE OR REPLACE
PACKAGE BODY employee_pkg as
Procedure print_ename(p_empno number) is
L_ename emp.ename%type;
Begin
Select ename into l_ename from emp where empno=p_empno;
Dbms_output.put_line(l_ename);
Exception
When no_data_found then
Dbms_output.put_line(‘Invalid employee number’);
End print_ename;
Procedure print_sal(p_empno number) is
L_sal emp.sal%type;
Begin
Select sal into l_sal from emp where empno=p_empno;
Dbms_output.put_line(l_sal);
Exception
When NO_DATA_FOUND then
Dbms_output.put_line(‘Invalid employee number’);
End print_sal;
End employee_pkg;
/
执行:
set serveroutput on
exec employee_pkg.print_ename(1234);
exec employee_pkg.print_ename(7782);
exec employee_pkg.print_sal(7782);
举报/反馈