開發(fā)包
1建立包?1) 建立包規(guī)范: 用于定義包的公共組建,包括常量,變量,游標,過程和函數(shù)等
?create or replace package emp_package is
? g_deptno number(3):=30;
? procedure add_employee(eno number,name varchar2,salary number dno number default g_deptno);
? procedure fire_empoyee(eno number);
? function get_sal(eno number) return number;
?end emp_package;
? 2) 建立包體
?? 用于實現(xiàn)包規(guī)范所定義的過程和函數(shù)。在包體中也可以單獨定義私有組件,包括變量,常量,過程和函數(shù)等。但在包體中所定義的組件只能在包內(nèi)使用,而不能由其他子程序引用。
?? create or replace package body emp_package is
??? function validate_deptno(v_deptno number)
????? return boolean;
??? is
????? 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;
??? procedure add_employee(eno number,name varchar2,salary number,dno number default g_deptno)
??? is
??? begin
????? if validate_deptno(dno) then
??????? insert into emp(empno,ename,sal,deptno)
???????? values(eno,name,salary,dno);
????? esle
??????? raise_application_error(-20011,'部門不存在');
????? end if;
??? exception
????? when dup_val_on_index then
??????? raise_application_error(-20011,'該雇員已存在')
??? end;
??? procedure fire_employee(eno number) is
??? begin
????? select from emp where empno=eno;
????? if sql%notfound then
???????? raise application_error(-20012,'');
????? end if;
??? end;
?? function get_sal(eno number) return number
?? is
???? 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(-200012,'');
?? end;
? end emp_package;
? 3) 調(diào)用包組建
??? -- 在同一個包內(nèi)調(diào)用組建 不需要加包名前綴,直接調(diào)用
? create or replace paclage body emp_package is
??? procedure add_employee(eno number,name varchar2,salary number,dno number default g_deptno)
??? is
??? begin
????? validate_deptno(dno) then
??? exception
??? end;
?? -- 調(diào)用包公用變量
?? exec emp_package.g_deptno:=20
?? -- 調(diào)用公用過程
?? exec emp_package.add_employee(111,'mary,2000');
?? -- 調(diào)用遠程數(shù)據(jù)庫包的公用組件
?? exec emp_paclage.add_employee@orasrv(1116,'scott',1200);
?? 4) 查看包源代碼
?? select text from user_source where name='emp_package' and type='package';
?? 5) 刪除包
?? drop packagee emp_package;
2 使用包重載
? 指多個具有相同名字的子程序,在調(diào)用的時候使用不同的參數(shù)傳遞。
? 1) 建立包規(guī)范
?? 同名過程和函數(shù)必須具有不同的輸入?yún)?shù),但同名函數(shù)返回值的類型數(shù)據(jù)必須相同
??? create or replace package overload is
??? function get_sal(eno number) return number;
??? function get_sal(name varchar2) return number;
??? procedure fire_employee(eno number);
??? procedure fire_employee(name varchar2);
?? 2) 建立包體
??? 。。。
3) 使用包構(gòu)造過程
?初始化全局變量
?1 建立包規(guī)范
?? create or replace packiage emp_package
?? is
?? minsal number(6,2);
?? maxsal number(6,2);
?? procedure upd_sal(eno number,salary number);
?? procedure upd_sal(name varhcar2,salary number);
?? end;-- 定義了兩全局變量和三個公用過程
?? 2 建立包體
??? create or replace package body emp_package is
????? procedure add_employee(cno number,name varchar2,salary number,dno number)
????? is
????? begin
??????? if salary between minsal and maxsal then
????????? insert into emp(empno,ename,sal,deptno)
???????? ........
??? -- 構(gòu)造過程,位于子程序尾部,已begin 開始已end 結(jié)束
???? begin
?????? select min(sal),max(sal) into minsal,maxsal from emp;
???? end;
????? end;
3 調(diào)用包公用組建
?? 在同一次會話中第一次調(diào)用包的公用組建時,會自動執(zhí)行其它構(gòu)造函數(shù),而將來調(diào)用其他組建時則不會再調(diào)用其構(gòu)造過程。
4 使用純度級別
?1 家里包規(guī)范
? create or replcace package purity is
? minsal number(6,2);
? maxsal number(6,2);
? function max_sal return number;
? function min_sal return number;
? pragma restrict_references(max_sal,wnps);--wnps 不能修改包的變量(不能給包的變量賦值)??????????????????????????????????????????? --wnds 不能執(zhí)行dml
? pragma restrict_references(min_sal,wnps);--rnps 用于限制函數(shù)不能讀取包變量
? end;
posted on 2006-10-11 14:46 康文 閱讀(364) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫