實(shí)現(xiàn)Oracle游標(biāo)的動(dòng)態(tài)形式講解
在開發(fā)過(guò)程的中,我們經(jīng)常要用到Oracle游標(biāo)來(lái)進(jìn)行相關(guān)的統(tǒng)計(jì)(不用臨時(shí)表)并且返回其統(tǒng)計(jì)結(jié)果,但是游標(biāo)的后面SQL語(yǔ)句往往是動(dòng)態(tài)的,例如select * from tablename where ?order ?."?"代表?xiàng)l件,這樣該如何處理呢?
在同事的幫助下我實(shí)踐了一下。總結(jié)出來(lái)。
假設(shè)tablename表中有field如下:
- field1 varchar2(50)
- field2 Varchar2(50)
- field3 Varchar(50)
- field4 varchar2(50)
- field5 varchar2(20)
- field6 float,
- field7 float
1.定義游標(biāo)
- 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.創(chuàng)建類型
創(chuàng)建的類型與tablename中表的fields一致,當(dāng)然也要看你實(shí)際是否要統(tǒng)計(jì)所有的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.創(chuàng)建表類型
- create or replace type TableTypeList as table of TableType;
4.在存儲(chǔ)過(guò)程或者函數(shù)中使用,下面在函數(shù)中使用(存儲(chǔ)過(guò)程中不能用return一個(gè)表結(jié)構(gòu),要用到臨時(shí)表)
- 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
這里是循環(huán)過(guò)程
- fetch v_Cur into v_Comm;
- exit when v_CommCur%notfound;
這里是你要處理的統(tǒng)計(jì)過(guò)程,中間的過(guò)程我沒有做統(tǒng)計(jì),各位在實(shí)踐中按需要自己添加。
- 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;
以上的相關(guān)內(nèi)容就是對(duì)Oracle游標(biāo)動(dòng)態(tài)形式的實(shí)現(xiàn)的介紹,望你能有所收獲。
【編輯推薦】