Я ищу метод возврата более одного значения (например, массива) из подпроцедуры в rpgle
. Я не хочу использовать файлы и т. д. для хранения этого значения. Может ли кто-нибудь порекомендовать какой-либо хороший метод для достижения этого?
Методы возврата списка значений из процедуры rpgle
Ответы (3)
При возврате не более 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;
При желании вы можете определить процедуру как возвращающую, например, 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;
Очередь данных, как упомянул Дэвид, и область данных - это другие возможности.
Они могут обеспечить большую доступность с другого языка. Но они немного сложны в использовании. К счастью, вы всегда можете предоставить оболочку, которая преобразует возвращаемый массив во что-то другое.
myarray
. Другими словами, за кулисами данные копируются. Дважды IIRC. Таким образом, производительность снижается при больших возвращаемых значениях.
- person Charles; 25.06.2016
myarray
.
- person Charles; 25.06.2016
Если вызываемая процедура решает, сколько элементов нужно вернуть, то при использовании механизма возвращаемого значения было бы хорошо определить возвращаемое значение как структуру данных, которая имеет массив и количество значений.
скопировать файл
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)
Рассмотрите возможность использования очереди данных для отправки списка значений обратно.
Процедура отправит результаты в очередь данных и вернет имя очереди данных (или ключ для очереди данных с ключом).
Затем вызывающая программа будет читать очередь данных (возможно, по ключу, если очередь уже существует) и обрабатывать записи.
Очереди данных работают быстро, легко, и у вас есть дополнительное преимущество, заключающееся в возможности использовать их с другими языками... даже если они не на IBM i (например, Java).