【问题标题】:Stored procedures and their output存储过程及其输出
【发布时间】:2013-01-12 03:14:21
【问题描述】:

调用存储过程的客户端只能处理记录集输出。

然而,存储过程应该返回简单的 0 或 1 值作为多个内部查询的结果。

是否有任何解决方法可以让存储过程变量值作为一种记录集返回?

【问题讨论】:

标签: oracle stored-procedures plsql


【解决方案1】:

返回一个游标变量;使用 SELECT .. FROM DUAL 打开游标变量,其中包含要从过程中返回的值。

该过程将返回一个游标,该游标返回包含这些值的单行。

【讨论】:

    【解决方案2】:

    从你的程序做

    OPEN resultsCursor_ FOR
    Select 1 As aValue FROM DUAL;
    

    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;
    

    【讨论】:

      【解决方案3】:

      过程不能返回值;您需要一个函数来执行此操作。

      如果你真的想要一个过程将光标“返回”给调用者,你可以 使用这样的东西:

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

      如果没有设置错误,则调用者可以执行此游标并针对它获取行。

      【讨论】:

      • 经过这么多尝试仍然没有运气。也许您可以指出哪里出了问题。
      • 请问哪里出错了?规范:创建或替换包 CTI_MATRIX.AMD AS 类型 REF_CURSOR 是 REF CURSOR;程序 AMD_NEEDMSG (v_CRN IN VARCHAR2, return_recordset OUT REF_CURSOR);结束 AMD;正文:创建或替换包体 CTI_MATRIX.AMD 作为过程 AMD_NEEDMSG(VARCHAR2 中的 v_CRN,返回记录集 REF_CURSOR)开始——结束 AMD_NEEDMSG;结束 AMD;来自 TOAD 的失败块:DECLARE RETURN_RECORDSET AMD.REF_CURSOR; BEGIN RETURN_RECORDSET := NULL; CTI_MATRIX.AMD.AMD_NEEDMSG ('123456789', RETURN_RECORDSET);结尾;错误:PLS-00382 表达式类型错误第 5 行
      • 是的;哪一行导致错误?我一直在 11G 中使用这个例子。如果您可以发布代码,我可以在这里进行测试。谢谢
      • 我改用以下方法:OPEN p_cur FOR SELECT return_flag AS ReturnFLag FROM DUAL;并且无法使用以下方法从外部访问此记录集:DECLARE RETURN_RECORDSET CTI_MATRIX.AMD.REF_CURSOR;开始 V_CRN := '5457648547567'; CTI_MATRIX.AMD_NEEDMSG (V_CRN, RETURN_RECORDSET); DBMS_OUTPUT.Put_Line('');犯罪;结尾;从 DUAL 表中访问字段 ReturnFlag 及其内容需要进入什么?尝试了各种方法,但无济于事!谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多