2013-01-11 99 views
0

調用存儲過程的客戶端只能處理記錄集輸出。存儲過程及其輸出

但是,存儲過程應該返回簡單的0或1值作爲幾個內部查詢的結果。

是否有任何解決方法我可以有一個存儲過程變量值作爲一種記錄集返回?

+0

在這裏尋找在Oracle中返回記錄集的清晰示例:http://stackoverflow.com/questions/14305883/toad-displaying-cursor-recordset-returned-by-stored-procedure/14320426#14320426 – Art

回答

1

返回遊標變量;用SELECT .. FROM DUAL打開您希望從過程返回的值的遊標變量。

該過程將返回一個遊標,返回包含這些值的單個行。

1

從你的程序做

OPEN resultsCursor_ FOR 
Select 1 As aValue FROM DUAL; 

OR

CREATE OR REPLACE PROCEDURE GetAValue 
(
    results_  OUT  SYS_REFCURSOR 
) 
IS 
    MY_COUNT_ INT; 
BEGIN 

    MY_COUNT_ := 10; 

    OPEN results_ FOR 
    SELECT MY_COUNT_ AS MyCount FROM DUAL; 

END GetAValue; 
0

過程不能返回一個值;你需要一個功能來做到這一點。

如果你真的想要一個程序,「給」遊標返回給調用者,可以 使用這樣的事情:

--Declare this type in a package X 
--The caller must have access to the package X. 
TYPE ref_cursor IS REF CURSOR; 
CREATE OR REPLACE 
PROCEDURE test (
        p_param1   IN VARCHAR2, 
        p_cur    OUT X.REF_CURSOR, 
        p_error_code  OUT NUMBER, 
        p_error_message OUT VARCHAR2 
       ) 
AS 
BEGIN 
     OPEN p_cur FOR 
     SELECT * FROM TABLE; 
EXCEPTION 
WHEN OTHERS THEN 

    p_error_code := SQLCODE; 
    p_error_message := SQLERRM; 

END; 

如果沒有錯誤設置,那麼調用者可以執行該光標並針對它提取行。

+0

經過這麼多次嘗試仍然沒有運氣。也許你可以指出,哪裏出了問題,請。 – user1970875

+0

哪裏出問題了? 規格: 創建或更換包裝CTI_MATRIX.AMD AS TYPE REF_CURSOR IS REF CURSOR; PROCEDURE AMD_NEEDMSG(v_CRN IN VARCHAR2,return_recordset OUT REF_CURSOR); END AMD; 體: CREATE OR REPLACE PACKAGE BODY CTI_MATRIX.AMD AS PROCEDURE AMD_NEEDMSG(v_CRN IN VARCHAR2,return_recordset OUT REF_CURSOR) IS BEGIN - END AMD_NEEDMSG; END AMD; TOAD失敗塊: DECLARE RETURN_RECORDSET AMD.REF_CURSOR;開始 RETURN_RECORDSET:= NULL; CTI_MATRIX.AMD.AMD_NEEDMSG('123456789',RETURN_RECORDSET); END; 錯誤:PLS-00382表達式是錯誤的類型行5 – user1970875

+0

是;哪一行導致錯誤?我在11G中一直使用這個例子。如果你可以發佈代碼,我可以在這裏進行測試。謝謝 –