Stored procedures ibmi上的外部存储过程

Stored procedures ibmi上的外部存储过程,stored-procedures,ibm-midrange,rpgle,Stored Procedures,Ibm Midrange,Rpgle,我试图在IBMi(V5R4)上创建一个外部存储过程,但在尝试运行它时遇到了一个错误 我只想调用一个RPG程序,而不用传递任何参数或担心返回任何数据。对不起,我不是RPG程序员或IBMi专家,所以我可能会错过一些非常简单的东西 用于创建过程的SQL语句: CREATE PROCEDURE SOMELIB.SOMEPROC ( ) LANGUAGE RPGLE NOT DETERMINISTIC NO SQL EXTERNAL NAME 'OTHERLIB

我试图在IBMi(V5R4)上创建一个外部存储过程,但在尝试运行它时遇到了一个错误

我只想调用一个RPG程序,而不用传递任何参数或担心返回任何数据。对不起,我不是RPG程序员或IBMi专家,所以我可能会错过一些非常简单的东西

用于创建过程的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不受BB1002RG在语句210000001指令X'0000'处的监控。原因……:由于发生异常且未处理,应用程序异常结束。向其发送未处理异常的程序的名称为SOMERG SOMERG。发送消息时,程序在高级语言语句编号处停止。如果显示多个语句编号,则该程序是一个优化的ILE程序。优化不允许确定单个语句编号。如果*N显示为一个值,则表示实际值不可用。恢复…:请参阅前面列出的低级消息以查找异常原因。请更正所有错误,然后重试该请求。

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

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

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

(稍微粗糙一点的解决方案)确定启动存储过程的用户。更改该用户的jobdescription以获得正确的库列表


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

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

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


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

解决此问题的建议:使用户配置文件JOBD包含存储过程所需的所有库。

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