Oracle下的動態資料指標實現(總結)

來源:互聯網
上載者:User
oracle|動態|遊標 不少朋友在開發過程中,要使用到遊標進行統計(不用暫存資料表)並返回統計結果,但遊標後面的SQL卻是動態,如select   *   from   tablename   where   ?   order   ?."?"代表條件,這樣該如何處理呢。在同事的協助下我實踐了一下。總結出來。  
   
  假設tablename表中有field如下:  
      field1   varchar2(50)  
      field2   Varchar2(50)  
      field3   Varchar(50)  
      field4   varchar2(50)  
      field5   varchar2(20)  
      field6   float,  
      field7   float  
   
  1.定義遊標  
  create   or   replace   package   RefCursor   is  
   
      --   Author     :   Ricky  
      --   Created   :   2003-9-1   14:08:45  
      --   Purpose   :    
      --   Public   type   declarations  
      type   t_RefCursor   is   ref   cursor;  
  end   RefCursor;  
   
  2.建立類型  
  建立的類型與tablename中表的fields一致,當然也要看你實際是否要統計所有的fields.  
   
  create   or   replace   type   TableType   as   object  
  (  
      --   Author     :   Ricky  
      --   Created   :   2003-8-25   9:12:08  
      --   Purpose   :  
      --   Attributes  
   
      field1   varchar2(50),  
      field2   Varchar2(50),  
      field3   Varchar(50),  
      field4   varchar2(50),  
      field5   varchar2(20),  
      field6   float,  
      field7   float  
  );  
   
  3.建立表類型  
  create   or   replace   type   TableTypeList   as   table   of   TableType;  
   
  4.在預存程序或者函數中使用,下面在函數中使用(預存程序中不能用return一個表結構,要用到暫存資料表)  
   
  CREATE   OR   REPLACE   FUNCTION   "TEST"   (  
   
  return   TableTypeList   pipelined   as  
   
  begin  
      v_Cur   RefCursor.t_Refcursor;  
      v_SQLStatement     string(10000);  
      v_Table   tablename%rowtype;  
   
      tmp1   tablename.field1%Type;  
      tmp2   tablename.field2%Type;  
      tmp3   tablename.field3%Type;  
      tmp4   tablename.field4%Type;  
      tmp5   tablename.field5%Type;  
      tmp6   tablename.field6%Type;  
      tmp7   tablename.field6%Type;  
   
      v_SQLStatement   :=   'Select   *   From   tablename   where   field1='1'   order   by   field1';  
   
      open   v_Cur   for   v_SQLStatement;  
      loop  
          --這裡是迴圈過程  
          fetch   v_Cur   into   v_Comm;  
          exit   when   v_CommCur%notfound;  
   
          --這裡是你要處理的統計過程,中間的過程我沒有做統計,各位在實踐中按需要自己添加。  
          field1   =   v_Cur.field1;  
          field2   =   v_Cur.field2;  
          field3   =   v_Cur.field3;  
          field4   =   v_Cur.field4;  
          field5   =   v_Cur.field5;  
          field6   =   v_Cur.field6;  
          field7   =   v_Cur.field7;  
   
          v_Table   =   TableType(field1,  
          field2,  
          field3,  
          field4,  
          field5,  
          field6,  
          field7)  
   
          pipe   row(v_Table);  
      end   loop  
  end;   
 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.