IBM i 上的外部存储过程

Posted

技术标签:

【中文标题】IBM i 上的外部存储过程【英文标题】:External stored procedure on IBM i 【发布时间】:2009-10-14 17:46:02 【问题描述】:

我正在尝试在 IBM i (V5R4) 上创建一个外部存储过程,但是当我尝试运行它时出现错误。

我只想调用一个 RPG 程序,无需传递任何参数或担心返回任何数据。抱歉,我不是 RPG 程序员,也不是 IBM i 方面的专家,所以我可能会遗漏一些非常简单的东西。

创建过程的 SQL:

CREATE PROCEDURE SOMELIB.SOMEPROC ( ) 

    LANGUAGE RPGLE 

    NOT DETERMINISTIC 

    NO SQL
    EXTERNAL NAME 'OTHERLIB/SOMERG' 

    PARAMETER STYLE GENERAL; 

执行 CALL SOMELIB.SOMEPROC() 时遇到的错误是:

SQL 状态:38501 供应商代码:-443 消息:[CEE9901] 应用程序错误。 RNX1216 在语句 2100000001,指令 X'0000' 处不受 BB1002RG 监控。原因 。 . . . . : 应用程序异常结束,因为发生了异常,没有处理。未处理的异常被发送到的程序的名称是 SOMERG SOMERG 。在发送消息时,程序在高级语言语句编号处停止。如果显示多个语句编号,则该程序是优化的 ILE 程序。优化不允许确定单个语句编号。如果 *N 显示为值,则表示实际值不可用。恢复 。 . . :查看前面列出的低级消息来定位异常的原因。更正所有错误,然后重试请求。

【问题讨论】:

在作业日志中检查更高的位置。您应该会看到来自 SOMERG 程序的错误消息。请发布该错误代码。 我们无法在作业日志中看到任何其他内容。 :( 我重新阅读了您的信息。您看到消息 RNX1216 了吗?这是一条文件错误消息,但它应该会引导您进一步返回另一条消息。这就像跟随一条疯狂的面包屑小径。如果有帮助的话,看起来 RNX1216 来自程序 BB1002RG。确保作业的 LOG 参数设置为 (4 00 *SECLVL)。 OK - 追踪错误:原因。 . . . . : 程序 OTHERLIB/BB1002RG 中的 RPG 程序 BB1002RG 在对文件 XYZ 执行隐式打开操作时收到消息 CPF4101。实际文件是 XYZ 所以 BB1002RG 程序(我在第一条消息中引用为 SOMERG )在从命令行调用时工作正常......但是当通过存储过程调用它时,它似乎不知道要使用哪个库找到文件 XYZ。我需要以某种方式传递库列表吗? 【参考方案1】:

您的过程正在调用没有设置库列表的 RPG 程序。您可以执行以下两项操作之一:

1) 更改 RPG 程序中的 F-spec 以使用 EXTFILE 关键字限定库。

2) 从存储过程中调用一个 CL 程序,将适当的库添加到库列表中,确保考虑到该库可能在​​之前的调用中已经存在。然后让 CL 程序调用 RPG 程序。

【讨论】:

看来我们要走 #2 路了。谢谢!【参考方案2】:

(稍微粗鲁一点的解决方案)识别启动存储过程的用户。更改该用户的作业描述以具有正确的库列表。

但根据我的经验,CL 程序也是最实用的解决方案。

【讨论】:

【参考方案3】:

假设文件与程序在同一个库中,将EXTFILE(variablename)USROPN 添加到F-spec。从 PSDS 中获取库名称并在 OPEN 文件之前构造 variablename 值。

如果文件和程序在不同的库中,您可以在程序库中创建一个数据区来保存数据库的名称。检索数据区域(使用 PSDS)而不是使用 PSDS(用于文件库)。如果程序和文件没有保存在一起,最好将数据库名称保存在可以更改而不是重新编译的外部对象中。

(实际上,在过去的十年左右,我很少使用数据区。相反,我创建了一个用户索引。*USRIDX 中的每个条目都替换了一个数据区。这些条目由一个过去的值作为键一个数据区域名称。一个对象替换许多其他对象,一个过程可以管理所有条目。一个对象拥有和授权可以减少一些系统开销。)

【讨论】:

【参考方案4】:

摆脱这个麻烦的建议:让用户配置文件JOBD包含存储过程所需的所有库。

【讨论】:

以上是关于IBM i 上的外部存储过程的主要内容,如果未能解决你的问题,请参考以下文章

实现 Java 存储过程 IBM DB2 for i (AS400)

通过 Data Studio 为 DB2 for IBM i (iSeries) 构建存储过程失败

cobol 上的外部存储过程 db2

sqlserver如何调用外部数据库的存储过程

IBM Worklight - 是不是可以使用 Out 参数调用存储过程?

IBM Worklight - 如何使用“OUT”参数调用存储过程?