从rpgle过程返回值列表的方法

时间:2016-06-24 18:34:23

标签: ibm-midrange rpgle

我正在寻找从rpgle中的子过程返回多个值(如数组)的方法。我不想使用文件等来存储此值。 有人可以推荐任何好的方法来实现这个目标吗?

3 个答案:

答案 0 :(得分:4)

最多只传回20个值......

你可以直接传回数组..

   dcl-proc TestProc;
     dcl-pi *n char(20) dim(20) ;
       parm1 char(20);
     end-pi;

     dcl-s myarray char(20) dim(20); 

     return myarray;
   end-proc;

或者,您可以将proc定义为例如返回DIM(200),并传入一个值,表示您实际需要多少个值。当您进行呼叫时,编译器会很乐意将DIM(200)截断为DIM(20)。这将提供更多的灵活性。如果你打算每秒打这1000次,那么缺点就是性能。返回"大"价值观会有一些性能损失。

假设最新版本的操作系统,IBM添加了RTNPARM关键字以提高大型返回值的性能。

   dcl-proc MainProc;
   dcl-s arr char(20) dim(20);
     arr = TestProc(%elem(arr));
     dsply arr(1);
   end-proc;

   dcl-proc TestProc;
     dcl-pi *n char(20) dim(200) rtnparm ;
       howmany int(10) value;
     end-pi;

     dcl-s myarray char(20) dim(200);
     dcl-s x int(10);
     for x = 1 TO howmany;
         // load array
         myarray(x) = 'Something';
     endfor;
     return myarray;
   end-proc;

David提到的数据队列和数据区域是其他可能性。

他们可能会通过其他语言提供更多辅助功能。但它们有点难以使用。幸运的是,您总是可以提供一个包装器,将返回的数组转换为其他内容。

答案 1 :(得分:4)

如果被调用的过程决定要返回多少个元素,那么如果使用返回值机制,最好将返回值定义为具有数组和值数的数据结构。

复制文件

dcl-c MAX_VALUES_RETURNED 20;
dcl-ds values_t qualified template;
   num int(10);
   arr char(200) dim(MAX_VALUES_RETURNED);
end-ds;
dcl-pr proc likeds(values_t) rtnparm;
 ...

<强>呼叫者

dcl-ds values likeds(values_t);
values = proc(parms);
for i = 1 to values.num;
     ... handle values.arr(i)

答案 2 :(得分:0)

考虑使用数据队列发回值列表。

该过程会将结果发送到数据队列并返回数据队列名称(或键控数据队列的密钥)。

然后,调用程序将读取数据队列(如果队列已存在,则可能通过密钥读取)并处理条目。

数据队列快速,简单,并且您具有能够与其他语言一起使用的额外优势......即使它们不在IBM i(例如java)上。