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。因此