裏面我有一個查詢運行查詢Oracle存儲過程
select * from myTable
......我想換這個查詢存儲過程中,並具有存儲過程輸出這個查詢的結果。
我該怎麼做?
在ms-sql中,我可以將我的查詢作爲字符串存儲到字符串變量中。然後執行「執行(變量)」。爲什麼Oracle沒有這樣的東西?
裏面我有一個查詢運行查詢Oracle存儲過程
select * from myTable
......我想換這個查詢存儲過程中,並具有存儲過程輸出這個查詢的結果。
我該怎麼做?
在ms-sql中,我可以將我的查詢作爲字符串存儲到字符串變量中。然後執行「執行(變量)」。爲什麼Oracle沒有這樣的東西?
用途:
CREATE OR REPLACE PROCEDURE MY_SPROC() RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
BEGIN
OPEN L_CURSOR FOR
SELECT * from MYTABLE;
RETURN L_CURSOR;
END;
使用這個,如果你想在Oracle運行動態SQL:
CREATE OR REPLACE PROCEDURE MY_SPROC() RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
L_QUERY VARCHAR2(5000) DEFAULT 'SELECT ...';
BEGIN
OPEN L_CURSOR FOR L_QUERY;
RETURN L_CURSOR;
END;
如果您想在動態SQL綁定變量:
CREATE OR REPLACE PROCEDURE MY_SPROC() RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
L_QUERY VARCHAR2(5000) DEFAULT 'SELECT ...';
BEGIN
OPEN L_CURSOR FOR L_QUERY
USING bind_var1;
RETURN L_CURSOR;
END;
您需要使用參考光標。
查看odp文檔。它有一個很好的例子,涵蓋了DB和.Net代碼。
它附帶安裝了oracle客戶端,但它隱藏在目錄結構的深處。轉到 - > odp - > doc - >。
參考遊標多年來一直是這樣做的標準方式,但是使用流水線表格有一個稍微不同的選擇e函數:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/tuning.htm#sthref2345
它們在數據倉庫應用程序中得到了相當廣泛的使用,並且執行可以並行化,因此它們性能非常高(不如僅僅運行SELECT)。
@Saobi:我更新了我的答案,在sproc中包含了動態SQL的示例,包括使用綁定變量(儘管我建議在大多數情況下使用CONTEXT)。 – 2009-10-14 21:17:46