
Zitat von
andreaspr@aon.at
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;
Bookmarks