2013-01-11 48 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中一直使用这个例子。如果你可以发布代码,我可以在这里进行测试。谢谢 –