Sowas lässt sich auch schön mit einer UDTF lösen.

create function mylib/myUDTF(
P#SCode varchar(3),
P#Selektion varchar(32000) )
returns table(tb_Feld1 char(60),
tb_Zahl1 dec(4, 0))

External Name 'MYLIB/MYSRVPGM(MYPROCEDURE)'
Language RPGLE
Disallow Parallel
modifies sql data
Parameter Style DB2SQL
Not Deterministic
Scratchpad 32;


mit einem Serviceprogramm diesen Aufbaus dahinter:
H NOMAIN DATEDIT(*DMY.) DATFMT(*EUR.) DECEDIT('0,') TIMFMT(*HMS)
H OPTION(*SRCSTMT:*NODEBUGIO:*NOUNREF)
*
*================================================= ===========================================*
* Konstanten:
*================================================= ===========================================*
D Ja C CONST('J')
D Nein C CONST('N')
*
*================================================= ===========================================*
* Variablen:
*================================================= ===========================================*
D M#Feld S 60A
D M#Zahl S 4P 0
*
* UDTF call parameter constants
D UDTF_FirstCall S 10I 0 Inz(-2)
D UDTF_Open S 10I 0 Inz(-1)
D UDTF_Fetch S 10I 0 Inz(0)
D UDTF_Close S 10I 0 Inz(1)
D UDTF_LastCall S 10I 0 Inz(2)
* SQL States
D SQLSTATEOK C '00000'
D ENDOFTABLE C '02000'
D UDTF_ERROR C 'US001'
* NULL Indicators
D ISNULL C -1
D NOTNULL C 0
*
*================================================= ===========================================*
* Funktionsimplementierung:
*================================================= ===========================================*
P MyProcedure...
P B EXPORT
D PI

* Table Function Eingabeparameter
D in_SCode 3A varying
D in_Selektion 32000A varying

* Table Function Ausgabeparameter (Spalten)
D tb_Feld1 60A
D tb_Zahl1 15A

* Null Indicator Input Parameters
D ni_SCode 5I 0
D ni_Selektion 5I 0

* Null Indicator Output Parameters
D ni_Feld1 5I 0
D ni_Zahl1 5I 0

* DB2SQL Style Parameters
D P#SQLState 5
D P#FunctionName 517
D P#SpecificName 128
D P#SQLMsgText 70 Varying
D P#ScratchPad 32 Varying
*
* UDTF Call Type
D P#TFCallType 10I 0
*
*================================================= ===========================================*
* Datenstruktur zur Zerlegung der Übergabeparameter zwischen SQL und RPG (sogen. "ScratchPad")
*================================================= ===========================================*
D ScratchDS DS 32 based(ptrScratch)
D Dummy 1A
*
*================================================= ===========================================*
* Code:
*================================================= ===========================================*
C EVAL ptrScratch = %addr(P#ScratchPad)
*
C SELECT
* Erster Aufruf:
C WHEN p#TFCallType = UDTF_Open
C EXSR SubOpen
*
* Satz-Anforderung:
C WHEN p#TFCallType = UDTF_Fetch
C EXSR SubFetch
*
* Beenden:
C WHEN p#TFCallType = UDTF_Close
C EXSR SubClose
C ENDSL
*
C RETURN
*
*================================================= ===========================================*
* Öffnen
*================================================= ===========================================*
C SubOpen BEGSR
*
* Aufrufen eines Hilfsprogramms, das eine Temporärdatei mit den gewünschten
* Daten erstellt:
<>
C CALL 'IRGENDWAS'
C PARM in_Selektion
*
/FREE
EXEC SQL declare csr cursor for
select EinText,
EineZahl
from MyLib/MyFile;

EXEC SQL open csr;

/END-FREE
*
C ENDSR
*================================================= ===========================================*
* Satz holen:
*================================================= ===========================================*
C SubFetch BEGSR
*
/FREE
EXEC SQL fetch next from csr into
:M#Feld,
:M#Zahl
/END-FREE
*
C IF SQLCOD = 0
C EVAL tb_Feld1 = M#Feld
C EVAL tb_Zahl1 = M#Zahl
*
C ELSE
C EVAL p#SQLState = ENDOFTABLE
C ENDIF
*
C ENDSR
*================================================= ===========================================*
* Letzter Aufruf:
*================================================= ===========================================*
C SubClose BEGSR
*
C/EXEC SQL
C+ close csr
C/END-EXEC
C EVAL *INLR = *ON
*
C ENDSR
P E

Im SQL kann man das dann mittels "table" wie eine Tabelle verwenden:
select * from table(myUDTF(Steuercode, Selektionsparameter));