2009-10-14 90 views
0

裏面我有一個查詢運行查詢Oracle存儲過程

select * from myTable 

......我想換這個查詢存儲過程中,並具有存儲過程輸出這個查詢的結果。

我該怎麼做?

在ms-sql中,我可以將我的查詢作爲字符串存儲到字符串變量中。然後執行「執行(變量)」。爲什麼Oracle沒有這樣的東西?

+0

@Saobi:我更新了我的答案,在sproc中包含了動態SQL的示例,包括使用綁定變量(儘管我建議在大多數情況下使用CONTEXT)。 – 2009-10-14 21:17:46

回答

5

用途:

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; 
+0

爲什麼這麼複雜?如果我可以清楚地運行這個查詢,爲什麼從存儲過程運行它更加複雜? – Saobi 2009-10-14 20:43:27

+0

在過程中存儲查詢可以更輕鬆地維護,更改和改進。 – 2009-10-14 20:47:22

+0

我沒有看到輸出結果的部分? – Rob 2009-10-14 22:33:27

0

您需要使用參考光標。

查看odp文檔。它有一個很好的例子,涵蓋了DB和.Net代碼。

它附帶安裝了oracle客戶端,但它隱藏在目錄結構的深處。轉到 - > odp - > doc - >。