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;