如何从返回多个 OUT 值的过程中仅访问一个 OUT 值?

Posted

技术标签:

【中文标题】如何从返回多个 OUT 值的过程中仅访问一个 OUT 值?【英文标题】:How to access just one OUT value from a Procedure that returns multiple OUT values? 【发布时间】:2019-03-06 17:36:17 【问题描述】:

我有一个 PL/SQL 过程,它有一个 IN/OUT 值和多个 OUT 值。

程序运行良好,我能够读取所有 OUT 值。

我现在想做的是从另一个过程中调用该过程,但只访问返回的 OUT 值之一。

例如:

  PROCEDURE MyProc
    (
    --INPUT/OUTPUT PARAMETERS
    io_myVar IN OUT NUMBER,
    o_TestNum1 OUT NUMBER,
    o_TestNum2 OUT NUMBER,
    o_Test1 OUT VARCHAR2
    );

现在我想这样调用这个过程:

MyProc(v_Input, , , v_TestOutput);

这显然是简化了,但返回的一些值实际上是自定义类型和自定义表/记录类型,所以骂得相当大。

我不想创建变量来存储我目前不需要处理的所有这些数据 - 我只对返回值中的一个感兴趣。

如何调用Procedure,只获取我感兴趣的一个值?

【问题讨论】:

【参考方案1】:

必须设置每个OUT 参数,但是您可以多次使用相同的虚拟变量来处理您不关心的输出。

例如,下面的代码将我们关心的OUT变量赋值给V_IMPORTANT。其他两个变量都分配给V_DUMMY。这不是一个完美的解决方案,但它至少减少了一点额外的代码。

declare
    v_important number;
    v_dummy     number;

    --Procedure with lots of OUT variables.
    procedure myProc(a out number, b out number, c out number) is
    begin
        a := 1; b := 2; c := 3;
    end;
begin
    myProc(v_important, v_dummy, v_dummy);
end;
/

【讨论】:

这看起来是我最好的选择,谢谢。一个复杂的问题(从我的简单示例中可能不清楚)是所有 OUT 值都是不同的类型,其中一些是自定义表/记录。在这种情况下如何重用相同的 v_dummy? @Stephen 不幸的是,您必须为每种类型创建一个单独的虚拟变量。【参考方案2】:

要实现这一点,您必须为每个参数组合定义一个 包装器 过程。

例如,仅获取您必须定义的最后一个参数:

create PROCEDURE MyProc2
    (
    io_myVar IN OUT NUMBER,
    o_Test1 OUT VARCHAR2
    ) as
v2 NUMBER; /* will be ignored */
v3 NUMBER;    
begin
  MyProc(io_myVar,v2,v3,o_Test1);
end;
/

【讨论】:

【参考方案3】:

你不能。查看完整的Tom Kyte's answer here。引用:

Parameter Mode  Is Default?          Role

IN              Default mode         Passes a value to the subprogram.

OUT             Must be specified.   Returns a value to the invoker.

IN OUT          Must be specified.   Passes an initial value to the subprogram and returns an updated value to the invoker.

【讨论】:

以上是关于如何从返回多个 OUT 值的过程中仅访问一个 OUT 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 查询中仅检查从存储过程返回的行的第一个值

MySQL存储过程返回多个值

如何在 QTableWidget 中仅获取包含值的行/列数?

从函数返回多个值的最佳方法是啥?

从函数返回多个值的最佳方法是啥?

如何从多次包含此值的表中仅获取 1 个结果?