Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
Nur den PATH kann man leider nicht mit Hostvariablen abbilden :-(
Ja das ist schade. Aber es klappt trotzdem grundsätzlich. Der Pfad wird im dynamischen SQL-String angefügt. Mein Problem war dabei das Clob für den JSON-String. Das funktioniert ganz gut mit den Host-Variablen.

Allerdings habe ich leider immer noch ein Problem mit den Zeichensätzen. Ich habe den SQL-String als varucs2 deklariert. Das Parser normaler Zeichenketten klappt sehr gut. Aber sobald ich ein echtes Unicode Zeichen im JSON-String drinhabe, wird nichts mehr geparst. Irgendwie haut das mit den Clobs und Unicode noch nicht so hin.

Die Deklaration dcl-s clobDS sqltype(clob:200000) ccsid(1200); wird vom Compiler nicht akzeptiert. Ich musste den Clob ohne ccsid deklarieren. Ich fürchte, dass da irgendwo das Problem liegt.

Hier mal das ganze Programm, falls es jemanden interessiert:
Code:
//==========================================================================================
// Funktion:
//
// Syntax zum Parsen von JSON mit der JSON_TABLE Funktion:
//    $ – Start with the current object
//    . – Look inside an object
//    [ ] – Look inside an array
//    – Reference the value associated with a key
//
//==========================================================================================
dcl-proc um_JSON_getString export;
   dcl-pi *n varucs2(200000);
      json_in varucs2(200000) const;
      path varucs2(1000) const;
   end-pi;


dcl-s anw varucs2(16000);
dcl-s json_clobDS sqltype(clob:200000);
dcl-s clobDS sqltype(clob:200000);


json_clobDS_data = %trim(json_in);
json_clobDS_len = %len(%trimr(json_in));


//Jetzt das SQL-Statement zusammenbauen:
anw = 'select inhalt from JSON_TABLE(?, ' + um_hkUni('lax $')
    + ' columns( inhalt clob(200000) path ' + um_hkUni('lax $.' + path) + ')) as json';


exec sql prepare cmd from :anw;
exec sql declare csr1 cursor for cmd;


exec sql open csr1 using :json_clobDS;
UM_JoblogSQL(sqlcod:##PGMNAME:'open');


if sqlcod = 0;
   exec sql fetch next from csr1 into :clobDS;
   if sqlcod <> 0;
      clear clobDS;
      UM_JoblogSQL(sqlcod:##PGMNAME:'fetch');
   endif;
endif;


exec sql close csr1;


return %ucs2(%trimr(%subst(clobDS_data:1:clobDS_len)));


end-proc;