Nachtrag

29 Parameter sind ja doch releativ viel, da die Gesamtanzahl Paramter auf (ich glaube) 32 beschränkt ist.
Wenn dies alles Ausgabeparameter sind, bietet sich eine andere, flexiblere Lösung an:

as400db.Execute "CREATE PROCEDURE MyLib.MyPgm (IN :PARM1 CHAR (512), IN :PARM2 DEC(15, 5)) LANGUAGE RPG RESULT SET 1 NOT DETERMINISTIC NO SQL EXTERNAL NAME MyLib.MyPgm PARAMETER STYLE GENERAL", , adExecuteNoRecords

Damit kannst du eine dynamisches Recordset zurückgeben:

h dftactgrp(*no) actgrp('MyGroup')

d MyStruct ds
d Field1 10
d Field2 5
d Field3 10p 2
:

/exec sql set result sets array MyStruct for 1 row
/end-exec

eval *inlr = *off

Wichtig ist, das das Programm aktiv bleiben muss, da auf die Variablen von SQL noch zugegriffen werden muss.

Vorteil:
Die Anzahl der Prozedur-Paramter reduziert sich und bei Erweiterung der Return-Werte braucht die Prozedur nicht neu beschrieben werden.

Die Anzahl der Zeilen kann auch dynamisch festgelegt werden:

d MyCount s 5p 0
d MyStruct ds dim(1000)

/exec sql set result sets array MyStruct for :MyCount row
/end-exec

Anzahl kann natürlich auch 0 sein (leeres Recordset).

Mit "set MyRcd = as400cmd.Execute" wird dann ein Recordset zurückgegeben.

Ich denke, dass dieses Verfahren für Dich vielleicht die bessere Lösung darstellt.