天天看点

PL/SQL 11g R2 —— 包

set serveroutput on
--包由包规范和包体两部分组成
--包规范里面定义的对象是全局的
--包体里面定义的对象是局部的
--定义包规范
create or replace package emp_package is  --使用了重载,两个过程名相同,参数不同 
  procedure get_sal(v_empno in number);   --全局过程 
  procedure get_sal(v_ename in varchar2); --全局过程
end emp_package;
/

--定义包体
create or replace package body emp_packageis function count_sal(v_empno in number) --局部函数 
  return number is v_sal emp.sal%type; 
  begin 
    select emp.sal into v_sal from emp where emp.empno=v_empno; 
    return v_sal; 
  end; 
  procedure get_sal(v_empno in number) --全局过程 
    is v_sal emp.sal%type; 
  begin 
    v_sal:=count_sal(v_empno); --调用局部函数 
    dbms_output.put_line('工资='||v_sal); 
  end; 
  procedure get_sal(v_ename in varchar2) --全局过程 
  is v_sal emp.sal%type; 
  begin 
    select emp.sal into v_sal from emp where emp.ename=v_ename; 
    dbms_output.put_line('工资='||v_sal); 
  end;
end emp_package;
/
--调用包
exec emp_package.get_sal(7788);
exec emp_package.get_sal('KING');
--当使用包全局函数的时候,可以在sql中调用
--那么全局函数有以下限制
--包的纯度级别:
--wnds 禁止执行dml操作
--wnps 不能给包变量赋值
--rnds 禁止执行dql操作
--rnps 不能将包变量值赋给其他变量
create or replace package emp_package 
is 
  function get_sal return number; 
  pragma restrict_references(get_sal,wnds);
end;
/