Anmelden

View Full Version : Dynamisches embedded SQL



Seiten : [1] 2

Tschabo
22-08-14, 08:39
Hallo,

ist stehe gerade etwas auf dem Schlauch.

Mit folgendem embedded SQL kann ich Anzahl der Sätze in der Datei ADRKOP ermitteln und in das Feld COUNT ausgeben.

C/EXEC SQL
C+ select count(*)
C+ into :count
C+ from adrkop
C/END-EXEC

Nun möchte ich nur noch den Dateinamen variabel gestalten. Also zuerst das SQL-Statement zusammenstellen und dann ausführen.

Aber so geht’s ja nicht!!
sqlstatement =
' select count(*)' +
' into :count' +
' from ' + file

Wie muss denn hierzu das SQL-Statement aussehen?

Fuerchau
22-08-14, 08:47
Dynamisches SQL mit Ergebnis geht nur mit Cursor!

sqlstmt = 'select Count(*) from ' + MyFile;
exec SQL prepare MyStmt from : sqlstmt;
exec SQL declare MyCursor Cursor for MyStmt;
exec SQL open MyCursor;
exec SQL fetch MyCursor into : Count;
exec SQL Close myCursor;

Dies beschreibt nur das Prinzip, die genaue Syntax entnimm bitte dem Handbuch.

B.Hauser
22-08-14, 09:10
SELECT ... INTO kann nicht in Verbindung mit dynamischem SQL verwendet werden, wohl aber VALUES ... INTO.


YourSQLStmt = 'VALUES(Select Count(*) from ' + File +
' ) into ?';
exec SQL Prepare DynSQL from MySQLStmt;
exec SQL Execute DynSQL using (:YourOutput);

Wenn's nur darum geht wieviele Sätze in einer Tabelle vorhanden sind (und Du die Bibliothek kennst), kannst Du das ganze auch mit statischem SQL machen.


Exec SQL Select Number_Rows into :Count
From SysTableStat
Where System_Table_Schema = :YourSchema
and System_Table_Name = :YourFile;


Birgitta

Tschabo
22-08-14, 09:43
Vielen Dank für die schnelle Hilfe:)

MoellerH
11-03-21, 06:01
Hallo Brigitta, gibt es eine Möglichkeit die Anzahl der Datensätze (count..) einer IFS-Datei zu ermitteln ? Ich arbeite später im Programm mit FROM TABLE(QSYS2.IFS_READ(PATH_NAME......
Gruss Heinrich

B.Hauser
11-03-21, 07:18
Eine IFS-Datei ist ein langer String und hat eigentlich keine Zeilen.
Wenn Du allerdings Umbrüche mit CRLF in deiner IFS-Datei hast und darauf basierend die Zeilen ermitteln willst, warum verwendest Du dann nicht einen einfachen Count(*) in Verbindung mit dem IFS_READ?


Select Count(*) from Table(IFS_READ(...));

Andreas Prouza wird wahrscheinlich auch ein Beispiel mit Regular-Expressions bringen, in dem die CRLFs abgezählt werden.

... auf alle Fälle gibt es keinen IBM Service, mit dem die Anzahl der "Zeilen" in einer IFS-Datei ermittelt werden kann (zumindest ist mir keiner bekannt)

Birgitta

MoellerH
11-03-21, 07:32
Ich bin im embedded SQL unterwegs (prepare, execute…) Damit bekomme ich das mit dem IFS_READ einfach nicht hin. Der Name des Pfads kommt per Variable .

Andreas_Prouza
11-03-21, 07:47
Wenn es eine CHAR Variable ist (und keine VARCHAR) musst du den Pfad mit TRIM die Blanks wegschneiden.

lg Andreas

Andreas_Prouza
11-03-21, 08:05
Andreas Prouza wird wahrscheinlich auch ein Beispiel mit Regular-Expressions bringen, in dem die CRLFs abgezählt werden.

Klar, kann ich machen :-)

exec sql set :variable = regexp_count(GET_CLOB_FROM_FILE('/verzeichnis/file.txt'), X'0D'))

Der HEX Wert hängt vom Typ des Files ab, welcher HEX Wert für die Zeilenbegrenzung verwendet wird.
Bei großen Files ist auch hier die Variante mit regex um mehr als 10 Mal schneller als das IFS_READ.

lg Andreas

B.Hauser
11-03-21, 08:47
Ich bin im embedded SQL unterwegs (prepare, execute…) Damit bekomme ich das mit dem IFS_READ einfach nicht hin. Der Name des Pfads kommt per Variable .

Was für einen Fehler bzw. SQLCODE bekommst Du denn an welcher Stelle?
Kann das (aufbereitete) SQL Statement mit ACS - Run SQL Scripts korrekt ausgeführt werden?

Wenn Du mit dynamischem SQL, also PREPARE und EXECUTE arbeitest, musst Du natürlich auch dafür sorgen, dass alle Hochkommata im String verdoppelt werden, also auch vor und nach der IFS-Datei!

Also etwa so:

DynSQLStmt = 'Select * from Table(IFS_Read(''' + %Trim(YourIFSFile) + '''))';

Du solltest auf alle Fälle prüfen, ob dynamisches SQL überhaupt notwendig ist. Nach meiner Erfahrung können über 90% aller SQL Statements in embedded SQL statisch gehandelt werden.
... und ich hab' in meinem Leben schon jede Menge (embedded) SQL Programme geschrieben.