IBM i上的外部存储过程

时间:2009-10-14 17:46:03

标签: stored-procedures ibm-midrange rpgle

我正在尝试在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显示为值,则表示实际值不可用。恢复。 。 。 :查看先前列出的低级别消息以查找异常原因。纠正任何错误,然后再次尝试请求。

4 个答案:

答案 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包含存储过程所需的所有库。