天天看點

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;
/