【问题标题】:How to have optional OUTPUT parameter如何有可选的 OUTPUT 参数
【发布时间】:2020-06-19 17:15:42
【问题描述】:

我有一个动态存储过程,我用它来运行多个选择查询。我已经定义了如下内容。

CREATE PROCEDURE DYNAMIC                     
   (IN   IN_COLUMN1                VARCHAR(150), 
    IN   IN_COLUMN2                VARCHAR(500), 
    IN   IN_COLUMN3                VARCHAR(500), 
    IN   IN_COLUMN4                CHAR(08),     
    IN   IN_COLUMN5                DATE,     
    IN   IN_COLUMN6                CHAR(05),     
    OUT  OUT_COLUMN1               CHAR(01),     
    OUT  OUT_COLUMN2               DEC(4,0),     
    OUT  OUT_COLUMN3               DEC(4,0),     
    OUT  OUT_COLUMN4               CHAR(04), 
    OUT  OUT_COLUMN5               DATE

这里的问题是,当我运行 Query1 时,我将在 IN_COLUMN1、IN_COLUMN2、IN_COLUMN3 中从 COBOL DB2 程序传递输入,并且 OUTPUT 将被提取到 OUT_COLUMN1。我将在程序中初始化所有 INPUT,由于 OUT_COLUMN2、OUT_COLUMN3、OUT_COLUMN4 和 OUT_COLUMN5 等其他 OUTPUT 参数将为空,我得到 SQLCODE "-305"。

为了解决这个问题,我尝试将 OUTPUT 参数设置为默认值,如下所示,但在部署时出错。

OUT  OUT_COLUMN2               DEC(4,0) DEFAULT NULL,

有什么办法可以解决这个问题。我正在使用 COBOL 调用在 DB2 中运行的存储过程。

【问题讨论】:

    标签: stored-procedures db2 cobol


    【解决方案1】:

    假设 IBM Enterprise COBOL,

    要在 SQL 中处理 COBOL 主变量中的空值,您需要为每个可空变量分配一个“空指示符”。

    请参阅:Using host variables in SQL Statements(在 COBOL 中有示例)。

    如果结果变量为空,则空指示符通常为负数。

    默认情况下,DB2 for z/OS Native SQL 存储过程的所有参数都可以为空。 (Db2 for z/OS 12.0.0 - Creating Native SQL Procedures)

    对于解决我认为是手头任务的其他方法,

    虽然我认为至少 DB2 用户定义函数可能支持function overloading,但存储过程不支持。这可能是一个替代方案。

    否则我会建议从您的存储过程中返回一个动态结果集吗?然后由存储过程的调用者来处理结果集的不同配置,这在 COBOL 中是完全可行的。

    关于UDF重载:

    “一个模式可以包含多个具有相同名称但每个具有不同数量的参数或具有不同数据类型的参数的函数。此外,具有相同名称、参数数量和参数类型的函数可以存在于多个架构中。”

    https://www.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/sqlref/src/tpc/db2z_functionresolution.html

    希望对你有所帮助。

    【讨论】:

    • 谢谢它有效,但我必须对所有 OUTPUT 字段使用 NULL 指示符,即使该字段被定义为 NOT NULL。
    猜你喜欢
    • 2011-03-17
    • 2016-05-26
    • 1970-01-01
    • 2014-12-04
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多