我正在尝试在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由BB1002RG在语句2100000001,指令X'0000'不受监视。原因。 。 。 。 。 :应用程序异常终止,因为发生了异常并且未处理。未处理的异常发送到的程序的名称是SOMERG SOMERG。在发送消息时,程序在高级语言语句编号处停止。如果显示多个语句编号,则该程序是优化的ILE程序。优化不允许确定单个语句号。如果* N显示为值,则表示实际值不可用。恢复。 。 。 :查看先前列出的低级别消息以查找异常原因。纠正任何错误,然后再次尝试请求。
答案 0 :(得分:4)
您的程序在没有设置库列表的情况下调用RPG程序。你可以做以下两件事之一:
1)更改RPG程序中的F-spec以使用EXTFILE关键字限定库。
2)从存储过程调用CL程序,该程序将相应的库添加到库列表中,确保允许库可能已经存在于先前的调用中。然后让CL程序调用RPG程序。
答案 1 :(得分:2)
(更粗鲁的解决方案)确定启动存储过程的用户。将该用户的作业描述更改为具有正确的库列表。
但根据我的经验,CL程序也是最实用的解决方案。
答案 2 :(得分:2)
假设文件与程序位于同一个库中,请将EXTFILE(variablename)
和USROPN
添加到F-spec。从PSDS中获取库名称,并在variablename
文件之前构造OPEN
值。
如果文件和程序位于不同的库中,您可以在程序库中创建一个数据区来保存数据库的名称。检索数据区域(使用PSDS)而不是使用PSDS(用于文件库)。如果程序和文件没有保存在一起,最好将数据库名称保存在可以更改的外部对象中,而不是重新编译。
(实际上,我在过去十年左右很少使用数据区。而是创建了一个用户索引。* USRIDX中的每个条目都替换了一个数据区。这些条目用以前的值键入数据区域名称。一个对象替换了许多其他对象,一个过程可以管理所有条目。一个拥有和授权的对象减少了一些系统开销。)
答案 3 :(得分:1)
建议摆脱这种麻烦:使用户配置文件JOBD包含存储过程所需的所有库。