1、建立包
包用于逻辑组合相关的PL/SQL类型、项和子程序,它由包规范和包体两部分组成。当建立包时,需要建立包
规范,然后再建立包体。
(1)、建立包规范
。在包规范中所定义的公用组件不仅可以在包内引用,而且也可以由其他的子程序引用。假定在定义包规范
emp_packge时,定义了公用变量g_deptno、公用过程add_employee和fire_employee,以及公用函数get_sal,那
么他们不仅可以在包emp_packge内引用,也可以由其他子程序引用。
---建立包规范
create or replace package emp_package is
g_deptno number(3):=30;
procedure add_employee(eno number, ename varchar2,sal number,dno number default g_deptno);
procedure fire_employee(eno number);
function get_sal(eno number)return number;
end emp_package;---end 后面可以跟命名的名称
当执行了以上命令之后,会建立包规范emp_package,并且定义了所有公用组件。但是因为只定义来了过程
和函数的头部,没有编写过程和函数的执行代码,所以公用的过程和函数只有在建立了包体之后才能调用。
(2)、建立包体
、过程和函数等,但在包体中所定义的私有组件只能在包内使用,而不能由其他子程序引用。假定在建立包体
emp_package时定义了函数validate_deptno,那么该函数只能包emp_package内使用,而不能由其他子程序调用
。
,必须建立包体。
----建立包体
create or replace package body emp_package is
function validate_deptno(v_deptno number)return boolean is ----validate_deptno
v_temp int;
begin
select 1 into v_temp from dept where deptno=v_deptno;
return true;
exception
when no_data_found then return false;
end validate_deptno;
procedure add_employee(eno number, ename varchar2,sal number,dno number default g_deptno)is---add_employee
begin
if validate_deptno(dno)then
insert into emp(empno,ename,sal,deptno)values(eno,ename,sal,dno);
else
RAISE_ApPLICATION_ERROR(-20000,'不存在该部门');
end if;
exception
when dup_val_on_index then RAISE_APpLICATION_ERROR(-20011,'该雇员已存在');
end add_employee;
procedure fire_employee(eno number)is --------fire_employee
begin
delete from emp where empno=eno;
if sql%notfound then
RAISE_APPLICATION_ERROR(-20012,'该雇员不存在');
end if;
end fire_employee;
function get_sal(eno number)return number is ---get_sal
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=eno;
return v_sal;
exception
when no_data_found then
RAISE_ApPLICATION_ERROR(-20012,'该雇员不存在');
end get_sal;
end emp_package;
当执行了以上命令之后,会建立包体emp_package,应用程序只能直接调用该包内的所有公有组件,而私有函
数validate_deptno则不能被应用程序调用。
(3)、调用包组件
以在其他应用程序中调用。但需要注意,当在其他应用程序中调用包的组件时,必须要家包名作为前缀(包名.
组件名)。
(一)、在同一个包内调用包组件
add_employee调用包内私有组件validate_deptno为例,说明调用同一个包内的其他组件的方法。
create or replace package body emp_package is
procedure add_employee(eno numberk,ename varchar2,salary number,dno number default g_deptno)is
begin
if validate_deptno(dno)then
insert into emp(empno,ename,sal,deptno)values(eno,ename,salary,dno);
else
raise_application_error(-20010,'不存在该部门');
end if;
exception
when dup_val_on_index then
raise_application_error(-20011,'该雇员已存在');
end;
(二)、调用包公用变量
话内一直生效。
declare
begin
emp_package.g_deptno:=21;
end;
(三)、调用包公用过程
declare
begin
emp_package.add_employee(1212,'yang',2000,10);------部门不给值会报错
emp_package.add_employee(2121,'tender',2000,20);
end;
(四)、调用包的公用函数
一部分来调用,所以应该定义变量接收函数的返回值。
declare
salary number;
begin
salary:=emp_package.get_sal(7788);
dbms_output.put_line(salary);
end;
(五)、以其他用户身份调用公用包组件
----SCOTT.EMP_PACKAGE.。。。。
(六)、调用远程数据库包的公用组件
后缀(包名.组件名@数据库链名)。
EMP_PACKAGE.ADD_EMPLOYEE@TENDER(1111,'SCOTT',1233,10)
(4)、查看包源代码
以显示当前用户的包及其源代码。
select text from user_source where name='emp_package'and type='package'
纯度级别
---WNDS用于限制函数不能修改数据库数据--- WNPS 用于限制函数不能修改包变量
--- RNDS 用于限制函数不能读取数据库数据
--- RNPS 用于限制函数不能读取包变量