0

在我的 SQL Server 实例中,我有一个到 AS400 的链接服务器。

我想执行一个 CLP 程序,它需要 2 个参数,一个numeric(8,0)作为输入,一个alphanumeric(3)作为输出。

这些是我用来执行此操作的 SQL 命令:

DECLARE @Ret varchar(3)
DECLARE @Date varchar(8)
SET @Date = '20200721'
SET @Ret = '   '

EXEC ('CALL IASP01.WUTL.WUTL46(''' + @Date + ''', ''?'')', @Ret) AT AS400 

SELECT @Ret

该命令执行没有错误,但没有返回任何结果。

第二个参数是一个varchar(3)参数,因为 AS400 需要一个字母数字参数来返回结果,但它始终为空。

谁能帮我?

提前致谢

更新:

我还尝试创建一个仅接受 1 个参数并修改其值的简单 CLP。以下是简单的 CLP 代码:

PGM        PARM(&DATA)                                  
            DCL        VAR(&DATA) TYPE(*DEC) LEN(8 0)                
            CHGVAR     VAR(&DATA) VALUE(20200722)                                                                       
            ENDPGM          

这是一个非常简单的程序,它接受一个 numeric(8,0) 参数并修改它的值。

下面是我用来执行 DB2 RPG 的 Sql Server 代码:

声明@P1 数字(8, 0) 选择@P1 = 00000000

exec ('CALL .<RPG_Name>(''?'')', @P1 OUTPUT) AT AS400 选择 @P1

执行成功,没有错误。在此调用之后,@P1 变量包含初始值而不是修改后的值,因此在此调用之后我无法在 Sql Server 中获取“返回”值。我该怎么做?

或者如何将值从 CLP 返回到 Sql Server?

谢谢

4

1 回答 1

0

尝试在 DB2 中创建存储过程定义。如果没有它,我很惊讶它完全可以工作,但也许 DB2 足够聪明,可以在使用默认参数定义的调用时调用程序。不幸的是,默认参数定义仅为输入。

您可以在知识库中找到文档。但它是这样的:

CREATE PROCEDURE SIMPLE_CLP
  (INOUT DATA DECIMAL(8, 0))
  LANGUAGE CL
  PARAMETER STYLE GENERAL
  DETERMINISTIC
  NO SQL
  EXTERNAL NAME 'SIMPLE_CLP';

然后你应该能够使用 INOUT 参数。

于 2020-07-28T13:22:12.377 回答