return 来自 rpgle 过程的值列表的方法

Methods to return a list of values from rpgle procedure

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

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

该过程会将结果发送到数据队列和return数据队列名称(或键控数据队列的键)。

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

数据队列快速、简单,而且您还有一个额外的优势,那就是可以将它与其他语言一起使用……即使它们不在 IBM i 上(例如,java) .

最多只能传回 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 定义为 returning DIM(200),并传入一个值来表示您实际需要多少个值。当您进行调用时,编译器会很乐意将 DIM(200) 截断为 DIM(20)。这将提供更多的灵活性。如果您打算每秒调用 1,000 次,那么缺点就是性能。返回 "large" 值有一些性能损失。

假设 OS 的最新版本,IBM 添加了 RTNPARM 关键字以提高大 return 值的性能。

   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 提到的数据队列和数据区是其他可能性。

它们可能会提高另一种语言的可访问性。但是它们有点难用。幸运的是,您总是可以提供一个包装器,将 returned 数组转换成其他东西。

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

复制文件

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)