【问题标题】:Nested stored procedure, setting variable to output/result嵌套存储过程,将变量设置为输出/结果
【发布时间】:2023-04-03 14:52:01
【问题描述】:

在 DB2 中,我目前正在运行一个存储过程,在其中我正在调用另一个带有参数的存储过程。

P1 : BEGIN ATOMIC

DECLARE V_ID INTEGER ;

CALL PROGRAMS. GET_ID_BY_NAME(P_NAME) ;

-- need output of above procedure to be set to V_ID for another call here

END P1 

如何将调用的结果设置为变量 V_ID,以便以后可以使用它?

【问题讨论】:

  • 您所说的“通话结果”是什么意思?您想获取内部过程中调用的RETURN 语句的值吗?

标签: sql db2


【解决方案1】:

如果 ID 和 NAME 之间的关系是 1:1 ,或者如果您根本不关心返回哪个匹配的名称,那么修改存储过程(或创建存储过程的重命名克隆和修改克隆的副本)以便存储过程具有 OUTPUT 参数,存储过程可以简单地 SET 匹配名称,并在返回时调用者存储过程只需使用该变量名称来访问其值。

您可能希望通过将输出参数设置为 NULL 来为不匹配进行防御性编码,并在调用代码中进行测试。如果您搜索官方 Db2 文档或其他地方,则有大量使用存储过程输出参数的示例。

使用存储过程的输出参数(而不是结果集)是最简单的方法,代码行数更少。

否则,如果 ID 和 NAME 的关系是 1:n,并且调用者想选择哪个匹配,那么被调用存储过程应该通过一个打开的 WITH RETURN 游标返回一个结果集(0 或更多行) .如果您想在它们之间进行选择(通常基于结果集中的另一列),您的调用者代码将需要处理返回的 0 行情况,并选择要使用的行(如果返回多行) .

要从调用过程内部访问被调用存储过程的结果集,调用过程需要使用类似[ASSOCIATE RESULT SET LOCATOR][1] (v1) WITH PROCEDURE PROGRAMS.GET_ID_BY_NAME 的语句,在CALL PROGRAMS.GET_ID_BY_NAME() 之后,然后是[ALLOCATE c1 CURSOR FOR RESULT SET][1] v1

您现在有一个游标,您可以将每行迭代到 FETCH 到变量中,最后您必须 CLOSE 游标。如果您知道结果集中只有一行,那么您不需要迭代。

如果您搜索,有很多这些语句的示例,包括在您的 Db2 版本和平台的 IBM 文档中。我已经显示了 Db2-LUW 的链接。

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2019-11-08
    相关资源
    最近更新 更多