開發包

          1建立包
          ?1) 建立包規范: 用于定義包的公共組建,包括常量,變量,游標,過程和函數等
          ?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) 建立包體
          ?? 用于實現包規范所定義的過程和函數。在包體中也可以單獨定義私有組件,包括變量,常量,過程和函數等。但在包體中所定義的組件只能在包內使用,而不能由其他子程序引用。
          ?? 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) 調用包組建
          ??? -- 在同一個包內調用組建 不需要加包名前綴,直接調用
          ? 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;
          ?? -- 調用包公用變量
          ?? exec emp_package.g_deptno:=20
          ?? -- 調用公用過程
          ?? exec emp_package.add_employee(111,'mary,2000');
          ?? -- 調用遠程數據庫包的公用組件
          ?? 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 使用包重載
          ? 指多個具有相同名字的子程序,在調用的時候使用不同的參數傳遞。
          ? 1) 建立包規范
          ?? 同名過程和函數必須具有不同的輸入參數,但同名函數返回值的類型數據必須相同
          ??? 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) 使用包構造過程
          ?初始化全局變量
          ?1 建立包規范
          ?? 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)
          ???????? ........
          ??? -- 構造過程,位于子程序尾部,已begin 開始已end 結束
          ???? begin
          ?????? select min(sal),max(sal) into minsal,maxsal from emp;
          ???? end;
          ????? end;
          3 調用包公用組建
          ?? 在同一次會話中第一次調用包的公用組建時,會自動執行其它構造函數,而將來調用其他組建時則不會再調用其構造過程。
          4 使用純度級別
          ?1 家里包規范
          ? 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 不能執行dml
          ? pragma restrict_references(min_sal,wnps);--rnps 用于限制函數不能讀取包變量
          ? end;

          posted on 2006-10-11 14:46 康文 閱讀(360) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阜新| 灵寿县| 隆德县| 左权县| 察雅县| 特克斯县| 英山县| 普宁市| 勐海县| 鹤壁市| 普兰店市| 祁东县| 上虞市| 绍兴市| 攀枝花市| 海阳市| 元江| 江山市| 钦州市| 灌云县| 波密县| 盱眙县| 岳阳县| 贺兰县| 页游| 怀远县| 绥德县| 耿马| 土默特左旗| 桃园县| 娱乐| 广水市| 北碚区| 安顺市| 马关县| 紫金县| 邵武市| 曲周县| 伊吾县| 华蓥市| 北安市|