關於oracle中動態遊標的使用例子ref cursor

 1、建立測試表  
  CREATE   TABLE   student  
    (  
      id                NUMBER,  
      name         VARCHAR2(30),  
      sex             VARCHAR2(10),  
      address     VARCHAR2(100),  
      postcode   VARCHAR2(10),  
      birthday     DATE,  
      photo        LONG   RAW  
    );  
  / 

 2、建立帶ref   cursor定義的包和包體及函數:  

---------創建包頭
  CREATE   OR   REPLACE  
  package   pkg_test   as  
  /*   定義ref   cursor類型  
        不加return類型,爲弱類型,允許動態sql查詢,  
        否則爲強類型,無法使用動態sql查詢;  
  */  
      type   myrctype   is   ref   cursor;    
     
  --函數申明  
      function   get(intID   number)   return   myrctype;  
      end   pkg_test;  
  /   
 

------------------------創建包體
  CREATE   OR   REPLACE  
  package   body   pkg_test   as  
  --函數體  
        function   get(intID   number)   return   myrctype   is  
            rc   myrctype;     --定義ref   cursor變量  
            sqlstr   varchar2(500);  
        begin  
            if   intID=0   then  
                  --靜態測試,直接用select語句直接返回結果  
                  open   rc   for   select   id,name,sex,address,postcode,birthday   from   student;  
            else  
                  --動態sql賦值,用:w_id來申明該變量從外部獲得  
                  sqlstr   :=   'select   id,name,sex,address,postcode,birthday   from   student   where  

id=:w_id';  
                  --動態測試,用sqlstr字符串返回結果,用using關鍵詞傳遞參數  
                  open   rc   for   sqlstr   using   intid;  
            end   if;  
     
            return   rc;  
        end   get;  
     
  end   pkg_test;  
  /  
     
  3、用pl/sql塊進行測試:  
  declare  
      w_rc               pkg_test.myrctype;   --定義ref   cursor型變量  
     
      --定義臨時變量,用於顯示結果  
      w_id               student.id%type;  
      w_name           student.name%type;  
      w_sex             student.sex%type;  
      w_address     student.address%type;  
      w_postcode   student.postcode%type;  
      w_birthday   student.birthday%type;  
     
  begin  
      --調用函數,獲得記錄集  
      w_rc   :=   pkg_test.get(1);  
     
      --fetch結果並顯示  
    loop  
    fetch   w_rc   into   w_id,w_name,w_sex,w_address,w_postcode,w_birthday;  
    exit   when   w_rc%notfound;  
    dbms_output.put_line(w_name);  
    end   loop;  
  end;  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章