建立package

perfychi發表於2012-08-02

create or replace package pack_one as --包頭的宣告

type cur is ref cursor;  --定義一個動態遊標,也只能是動態

type v_record is record( -- 定義一個記錄型別(集合的一種)

v_name emp.ename%type,

v_sal emp.sal%type,

v_dname dept.dname%type

);

function my_fun(v_job varchar2) return cur;  --定義一個方法

procedure my_pro(v_job in varchar2,my_cur2 out cur);--定義一個儲存過種

end pack_one;--包頭結束

 

create or replace package body pack_one as--建立一個包體

function my_fun(v_job varchar2) return cur--對方法的實現,注意是在包體的宣告部分裡操作

  is

  my_cur cur;--宣告遊標,因為還是在包的部分,所以直接宣告即可

  sql_cur varchar2(200);

  begin

  sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job||'''';--拼接SQL語句,重要注意引號的使用.因為job欄位是字串型。如果是numbr型別,就沒這麼費勁,海要加單引號了。

  dbms_output.put_line(sql_cur);--可以透過輸出為除錯拼接好的SQL語句

  open my_cur for sql_cur;--開啟遊標

  return(my_cur);--方法有返回值,要牢記

  end my_fun;--方法的實現結束

 

  procedure my_pro(v_job in varchar2,my_cur2 out cur)--對儲存過程的實現

    as

    sql_cur varchar2(200);

    begin

      sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job|| '''';

      open my_cur2 for sql_cur;--開啟遊標,注意,開啟的是傳進來的引數,即我們把遊標透過引數傳出給呼叫環境 因為是out

    end my_pro;

  begin

    null;

end pack_one;--儲存實現的結束

 

 


使用using 改寫上述過程(包體不部分):

create or replace package body pack_one asfunction my_fun(v_job varchar2) return cur  is

  my_cur cur  sql_cur varchar2(200);

  begin

  sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job= :job';

 --使用繫結變數時,即使是字串型別,也不需要格外加單引號, 繫結變數自身含有型別,透過下面的using v_job就給繫結變數賦予了合適的型別,此處千萬不要畫蛇添足,否則回報錯。這點與字串拼接是不同的。

 

  dbms_output.put_line(sql_cur);

  open my_cur for sql_cur     using v_job;

  return(my_cur);--方法有返回值,要牢記

  end my_fun;--方法的實現結束

 

  procedure my_pro(v_job in varchar2,my_cur2 out cur)--對儲存過程的實現

    as

    sql_cur varchar2(200);

    begin

      sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job= :job'; --使用繫結變數時,即使是字串型別,也不需要格外加單引號, 繫結變數自身含有型別,透過下面的using v_job就給繫結變數賦予了合適的型別,此處千萬不要畫蛇添足,否則回報錯。這點與字串拼接是不同的。

      open my_cur2 for sql_cur    using v_job;

    end my_pro;

  begin

    null;

end pack_one;--儲存實現的結束

 

 


 

 

declare--下面是對包的呼叫 呼叫其中的方法

v_cur pack_one.cur;--注意這裡遊標型別宣告的方式

my_record pack_one.v_record;--同上,注意宣告方式

begin

  v_cur:=pack_one.my_fun('CLERK');--透過引數調過方法,傳進的引數,會被接收 因為是in

 

    loop

      fetch v_cur into my_record;

      exit when v_cur%notfound;

      dbms_output.put_line(my_record.v_name||'--'||my_record.v_sal||'--'||my_record.v_dname);

      end loop;

  end;

 

 

 

 

declare --下面是對包的呼叫,呼叫其中的合儲存過程

temp_record pack_one.v_record;--同上,注意宣告方式

my_cur2 pack_one.cur;--注意這裡遊標型別宣告的方式

begin

  pack_one.my_pro('CLERK',my_cur2);--透過傳參,來呼叫,第一個引數是傳進,第二個是用於接收傳出的引數

  loop

    fetch my_cur2 into temp_record;

    exit when my_cur2%notfound;

    dbms_output.put_line(temp_record.v_name||'--'||temp_record.v_sal||'--'||temp_record.v_dname);

    end loop;

  end;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27042095/viewspace-739583/,如需轉載,請註明出處,否則將追究法律責任。

相關文章