... viel zu kompliziert eigentlich ...
Meiner Meinung geht das am "einfachsten" mit dem SQL Descriptor.

Ich hab mir da mal ein Beispiel-PGM zusammen gebastelt. Leider gibts darüber nicht viel Dokus bei der IBM.
Aber so sollte es klappen :

Code:
D vsql            s            512
D vtype           s             10
D vlength         s             10  0
D vresult_ind     s             10  0
D vCount          S             10  0
D i               S             10  0
 /Free

  //---- Sql Optionen setzen ----
  Exec Sql SET OPTION COMMIT=*NONE, CLOSQLCSR=*ENDMOD,
                       ALWBLK=*ALLREAD, ALWCPYDTA=*YES,
                       SRTSEQ=*HEX, DLYPRP=*YES;

  // SQL Cursor erstellen
  vSql = 'Select * From tab1';
  Exec Sql Prepare S1 from :vsql;
  Exec Sql Declare c1 Cursor For s1;

  // Descriptor mit der max. Anzahl der Spalten initialisieren
  Exec Sql allocate descriptor 'mydesc' with max 2;
  EXEC SQL DESCRIBE S1 Using descriptor 'mydesc';

  // Ersten Satz einlesen
  Exec Sql open c1;
  Exec Sql Fetch c1 into sql descriptor 'mydesc';
  
  // Anzahl der Spalten abrufen
  EXEC SQL GET DESCRIPTOR 'mydesc' :vCount = COUNT;
  
  // Alle Spalten mit deren Werte einlesen
  For i=0 to vCount;

    // Attribute der Spalte einlesen
    Exec Sql GET DESCRIPTOR 'mydesc' VALUE :i
                      :vtype = TYPE,
                      :vlength = LENGTH,
                      :vresult_ind = INDICATOR;
    if vresult_ind >= 0;
      Select;
      When vtype = '1'; // Character
        exec Sql GET DESCRIPTOR 'mydesc' VALUE :i
                        :sp2 = DATA;
      When vtype = '4'; // Integer
        exec Sql GET DESCRIPTOR 'mydesc' VALUE :i
                        :sp1 = DATA;
      endsl;
    endif;
  endfor;
  
  Exec Sql close c1;
  *INLR = *ON;
 /End-Free