開發(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ù)庫

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

          導航

          統(tǒng)計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 邓州市| 延庆县| 牡丹江市| 宜宾县| 阿拉尔市| 循化| 台中市| 兴海县| 柏乡县| 博白县| 永靖县| 镇沅| 轮台县| 霸州市| 富裕县| 镇赉县| 霍邱县| 武邑县| 紫云| 宁强县| 美姑县| 博爱县| 阜南县| 汾阳市| 广平县| 柳州市| 绥中县| 汉源县| 广饶县| 高雄县| 桂林市| 特克斯县| 阳信县| 南开区| 苏州市| 开封县| 桑植县| 泸西县| 谢通门县| 通辽市| 绍兴市|