程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 實現Oracle游標的動態形式講解

實現Oracle游標的動態形式講解

編輯:Oracle數據庫基礎

在開發過程的中,我們經常要用到Oracle游標來進行相關的統計(不用臨時表)並且返回其統計結果,但是游標的後面SQL語句往往是動態的,例如select * from tablename where ?order ?."?"代表條件,這樣該如何處理呢?

在同事的幫助下我實踐了一下。總結出來。

假設tablename表中有fIEld如下:

  1. fIEld1 varchar2(50)   
  2. fIEld2 Varchar2(50)   
  3. fIEld3 Varchar(50)   
  4. fIEld4 varchar2(50)   
  5. fIEld5 varchar2(20)   
  6. fIEld6 float,   
  7. fIEld7 float   

1.定義游標

  1. create or replace package RefCursor is   
  2. -- Author : Ricky   
  3. -- Created : 2003-9-1 14:08:45   
  4. -- Purpose :   
  5. -- Public type declarations   
  6. type t_RefCursor is ref cursor;   
  7. end RefCursor; 

2.創建類型

創建的類型與tablename中表的fields一致,當然也要看你實際是否要統計所有的fIElds.

  1. create or replace type TableType as object   
  2.  (   
  3. -- Author : Ricky   
  4. -- Created : 2003-8-25 9:12:08   
  5. -- Purpose :   
  6. -- Attributes   
  7. fIEld1 varchar2(50),   
  8. fIEld2 Varchar2(50),   
  9. fIEld3 Varchar(50),   
  10. fIEld4 varchar2(50),   
  11. fIEld5 varchar2(20),   
  12. fIEld6 float,   
  13. fIEld7 float   
  14.  );  

3.創建表類型

  1. create or replace type TableTypeList as table of TableType;  

4.在存儲過程或者函數中使用,下面在函數中使用(存儲過程中不能用return一個表結構,要用到臨時表)

  1. CREATE OR REPLACE FUNCTION "TEST" (   
  2. return TableTypeList pipelined as   
  3. begin   
  4. v_Cur RefCursor.t_Refcursor;   
  5. v_SQLStatement string(10000);   
  6. v_Table tablename%rowtype;   
  7. tmp1 tablename.fIEld1%Type;   
  8. tmp2 tablename.fIEld2%Type;   
  9. tmp3 tablename.fIEld3%Type;   
  10. tmp4 tablename.fIEld4%Type;   
  11. tmp5 tablename.fIEld5%Type;   
  12. tmp6 tablename.fIEld6%Type;   
  13. tmp7 tablename.fIEld6%Type;   
  14. v_SQLStatement := 'Select * From tablename where fIEld1='1' order by fIEld1';   
  15. open v_Cur for v_SQLStatement;   
  16. loop   

這裡是循環過程
 

  1. fetch v_Cur into v_Comm;   
  2. exit when v_CommCur%notfound;  

這裡是你要處理的統計過程,中間的過程我沒有做統計,各位在實踐中按需要自己添加。
 

  1. fIEld1 = v_Cur.fIEld1;   
  2. fIEld2 = v_Cur.fIEld2;   
  3. fIEld3 = v_Cur.fIEld3;   
  4. fIEld4 = v_Cur.fIEld4;   
  5. fIEld5 = v_Cur.fIEld5;   
  6. fIEld6 = v_Cur.fIEld6;   
  7. fIEld7 = v_Cur.fIEld7;   
  8. v_Table = TableType(fIEld1,   
  9. fIEld2,   
  10. fIEld3,   
  11. fIEld4,   
  12. fIEld5,   
  13. fIEld6,   
  14. fIEld7)   
  15. pipe row(v_Table);   
  16. end loop   
  17. end;  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved