4

我正在尝试在 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 显示为值,则表示实际值不可用。恢复 。. . :查看前面列出的低级消息来定位异常的原因。更正任何错误,然后重试请求。

4

4 回答 4

5

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

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

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

于 2009-10-15T17:38:31.837 回答
2

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

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

于 2009-11-11T14:26:50.967 回答
2

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

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

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

于 2014-03-23T10:12:18.220 回答
1

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

于 2015-01-31T02:00:54.720 回答