View Full Version : SQL: IFS_WRITE_UTF8 mit Variablen
Moin,
ich möchte in einer SQL-Prozedur per IFS_WRITE_UTF8 Daten ins IFS schreiben. Solange ich dies
die Parameter als Konstanten (wie unten dargestellt) mitgebe, funktionierts.
CALL QSYS2.IFS_WRITE_UTF8(
PATH_NAME => '/home/MyFolder/testfile.txt',
LINE => '',
OVERWRITE => 'REPLACE',
END_OF_LINE => 'CRLF') ;
Ich möchte diese aber in Variablen zusammenstellen und deren Inhalt mitgeben. Dann wird die Prozedur
aber nicht ausgeführt. Weiß jemand die funktionierende Syntax?
Die Variante mit RPG-Programm, Exec SQL und Variablen per :Variable mitgeben bitte nicht vorschlagen.
Es soll nur SQL genutzt werden.
Danke!
Andreas_Prouza
10-04-24, 15:56
Mir ist die Aufgabenstellung nicht ganz klar.
Was für Variablen meinst du wenn es nicht in RPG aufgerufen werden soll?
Du kannst in SQL Globale Variablen erstellen, die kannst du dann auch im CALL verwenden.
CREATE OR Replace VARIABLE deinelib.deinevar clob(1M);
Ich hab in der SQL-Prozedur per Declare Variablen definiert die die Werte enthalten
declare gblstring char(256)
set gblstring = '/mypath/myfile.html'
Sobald ich beim Call statt der Konstanten die Variable nehme, schlägt der Call fehl.
CALL QSYS2.IFS_WRITE_UTF8(
PATH_NAME => gblstring,
LINE => 'xxx',
OVERWRITE => 'REPLACE',
END_OF_LINE => 'CRLF') ;
Andreas_Prouza
10-04-24, 16:18
Du musst die Variable qualifiziert mit der Lib angeben. Ansonsten sucht er sie (glaube ich) über den PATH (nicht LIBL) ... bin mir aber jetzt nicht mehr sicher.
Welche Fehlermeldung gibt es denn?
I.d.R. scheitert es dann, wenn der Job in CCSID 65535 läuft.
Die SQL-Prozedur wird in C erstellt.
Konstanten werden nicht umgewandelt, Variableninhalte jedoch von der JOB-CCSID in die Ziel-CCSID.
Wenn der Job auf Hex steht, weiß SQL nicht von welcher CCSID in UTF8 umgewandelt werden soll.
Dies sollte mit eentsprechender Meldung im Joblog stehen.
Nachtrag:
Wenn du eine IFS-Datei zeilenweise mit SQL schreiben willst, musst du dich auf arge Performancenachteile einstellen.
Jeder IFS-Write macht einen Open, Pos, Write, Close, Update Header im IFS.
Bei einem Test habe ich festgehstellt, dass ca. 10 Writes / Sekunde funktionieren.
Empfehlung hier ist, die Daten nach Möglichkeit in einer Variablen vom Typ CLOB sammeln, z.B. per LISTAGG um sie dann mit einem Durchgang zu schreiben.
Schneller war das Verfahren allerdings immer noch, die Daten in eine Tabelle zu schreiben und dann per CPYTOSTMF oder CPYFRMIMPF in einem Rutsch zu schreiben.
Bei unserem Test z.B. statt 30 Sekunden für 300 Zeilen, nur noch 1 Sekunde.
Du musst die Variable als VARCHAR definieren ... und sicherheitshalber solltest Du auch bei der Parameter-Übergabe eventuelle führende/folgende Blanks abtrimmen.
declare gblstring Varchar(256);
set gblstring = '/mypath/myfile.html';
CALL QSYS2.IFS_WRITE_UTF8(
PATH_NAME => Trim(gblstring),
LINE => 'xxx',
OVERWRITE => 'REPLACE',
END_OF_LINE => 'CRLF') ;
Danke an alle für die Hilfe!
@Fuerchau: CCSID's vom Job und den Variablen waren schon alle korrekt gesetzt. Danke für den Hinweis auf die Performance, das check ich mal aus.
@Birgitta: Danke für den Tip Varchar zu nehmen, das ist's wohl schlussendlich gewesen.