如何有可选的输出参数

How to have optional OUTPUT parameter

我有一个动态存储过程,用于 运行 多个 select 查询。我定义了如下内容。

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 程序传递输入,并将获取输出进入 OUT_COLUMN1。我将初始化程序中的所有输入,由于 OUT_COLUMN2、OUT_COLUMN3、OUT_COLUMN4 和 OUT_COLUMN5 等其他输出参数将为空,我得到 SQLCODE "-305 ".

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

OUT  OUT_COLUMN2               DEC(4,0) DEFAULT NULL,

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

假设使用 IBM Enterprise COBOL,

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

参见:Using host variables in SQL Statements(使用 COBOL 格式的示例)。

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

默认情况下,z/OS 本机 SQL 存储过程的 DB2 的所有参数都可以为空。 (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

希望对您有所帮助。