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)
我正在寻找从 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)