Ibm midrange 方法从rpgle过程返回值列表

Ibm midrange 方法从rpgle过程返回值列表,ibm-midrange,rpgle,Ibm Midrange,Rpgle,我正在寻找从rpgle中的子进程返回多个值(如数组)的方法。我不想使用文件等来存储此值。 有人能推荐什么好方法来实现这一点吗?考虑使用数据队列将值列表发回 该过程将结果发送到数据队列,并返回数据队列名称(或键控数据队列的键) 然后,调用程序将读取数据队列(如果队列是预先存在的,则可能通过键)并处理条目 数据队列快速、简单,您还可以将其与其他语言一起使用。。。即使它们不在IBMi(例如java)上。考虑使用数据队列将值列表发回 该过程将结果发送到数据队列,并返回数据队列名称(或键控数据队列的键)

我正在寻找从
rpgle
中的子进程返回多个值(如数组)的方法。我不想使用文件等来存储此值。
有人能推荐什么好方法来实现这一点吗?

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

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

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


数据队列快速、简单,您还可以将其与其他语言一起使用。。。即使它们不在IBMi(例如java)上。

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

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

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


数据队列快速、简单,您还可以将其与其他语言一起使用。。。即使它们不在IBMi(例如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定义为返回
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提到的数据队列和数据区域是其他的可能性


它们可能有助于从另一种语言获得更多的可访问性。但是它们有点难用。幸运的是,您始终可以提供一个包装器,将返回的数组转换为其他内容。

最多只传递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提到的数据队列和数据区域是其他的可能性


它们可能有助于从另一种语言获得更多的可访问性。但是它们有点难用。幸运的是,您始终可以提供一个包装器,将返回的数组转换为其他内容。

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

复制文件

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)

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

复制文件

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)

谢谢你,大卫!!我一定会试试这个。DTAQ还不错,特别是它的简单性。但我可能会使用用户索引(*USRIDX)或用户空间(*USRSPC)。所有条目都可以通过单个操作加载到*USRIDX或从中检索,*USRSPC可以简单地使用指向它的指针来覆盖条目的DS。实际上,我可能只是在调用者中为所需数量的条目分配内存,然后将地址连同parm一起传递给proc,以告诉应该添加多少条目。谢谢David!!我一定会试试这个。DTAQ还不错,特别是它的简单性。但我可能会使用用户索引(*USRIDX)或用户空间(*USRSPC)。所有条目都可以通过单个操作加载到*USRIDX或从中检索,*USRSPC可以简单地使用指向它的指针来覆盖条目的DS。实际上,我可能只是在调用者中为所需数量的条目分配内存,然后将地址连同parm一起传递给proc,以告诉应该添加多少条目。需要更多信息。价值清单有多大?您还返回了什么?值的数量可以从0到20不等。基本上,这些值将用于显示在屏幕上(我正在考虑子文件)。最好编辑您的问题以包含任何其他信息。这样,所有信息都集中在一个地方。您是在传回一个简单的类型还是一个复杂的数据结构?需要更多信息。价值清单有多大?您还返回了什么?值的数量可以从0到20不等。基本上,这些值将用于显示在屏幕上(我正在考虑子文件)。最好编辑您的问题以包含任何其他信息。这样,所有的数据都在一个地方。你是在传回一个简单的类型还是一个复杂的数据结构?谢谢,我有返回数组的想法,但如果我从另一个模块调用这个过程,我对它是否会起作用表示怀疑。我的意思是,过程中的数组是本地的,所以在过程结束时它不会被清除。如果这样,请原谅这是一个愚蠢的问题。不,返回的值是“按值”返回的;您没有返回指向
myarray
的指针。换句话说,数据在幕后被复制。两次IIRC。因此