**Free ctl-opt Option(*Srcstmt:*Nodebugio:*NoUnRef); ctl-opt Debug(*Constants: *Retval); ctl-opt thread( *serialize ); ctl-opt nomain; //---------------------------------------------------------------- // Constants: dcl-c CALL_STARTUP -2; dcl-c CALL_OPEN -1; dcl-c CALL_FETCH 0; dcl-c CALL_CLOSE 1; dcl-c CALL_FINAL 2; dcl-c PARM_NULL -1; dcl-c PARM_NOTNULL 0; dcl-ds ds1 ; fld1 char(10) ; fld2 char(10) ; end-ds; dcl-ds n_ds1 ; n_fld1 int(5) ; n_fld2 int(5) ; end-ds; dcl-ds ds2 ; fld3 char(10) ; fld4 char(10) ; end-ds; dcl-ds n_ds2 ; n_fld3 int(5) ; n_fld4 int(5); end-ds; dcl-proc testUDTFds export ; dcl-pi *n; //...input parameters epds likeds(ds1) const; //...output parameters opds likeds(ds2) ; //...input null parameters n_epds likeds(n_ds1) const; //...output null parameters n_opds likeds(n_ds2) ; SQL_State char (5 ) ; Function varchar(517 ) const ; Specific varchar(128 ) const ; errorMsg varchar(1000 ) ; CallType int (10 ) const ; end-pi; //...procedure logic select CallType; when-is CALL_STARTUP; //...startup logic when-is CALL_OPEN; //...open logic when-is CALL_FETCH; //...fetch logic //...set output parameters opds = epds; n_opds = n_epds; SQL_State = '02000'; errorMsg = 'End of data!'; when-is CALL_CLOSE; //...close logic when-is CALL_FINAL; //...final logic endsl; return ; end-proc ;