[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Aug 2013
    Beiträge
    19

    Dynamisches embedded SQL

    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?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    SELECT ... INTO kann nicht in Verbindung mit dynamischem SQL verwendet werden, wohl aber VALUES ... INTO.

    Code:
    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.

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

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  4. #4
    Registriert seit
    Aug 2013
    Beiträge
    19
    Vielen Dank für die schnelle Hilfe

  5. #5
    Registriert seit
    Feb 2021
    Beiträge
    10
    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

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    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?

    Code:
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Feb 2021
    Beiträge
    10
    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 .

  8. #8
    Registriert seit
    Nov 2020
    Beiträge
    315
    Wenn es eine CHAR Variable ist (und keine VARCHAR) musst du den Pfad mit TRIM die Blanks wegschneiden.

    lg Andreas

  9. #9
    Registriert seit
    Nov 2020
    Beiträge
    315
    Zitat Zitat von B.Hauser Beitrag anzeigen
    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

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    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:
    Code:
    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.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Der Witz an dem Count der CR einer IFS-Datei ist, dass das Zählen genau so lange dauert wie das Verarbeiten. Von Vorteil ist das nicht gerade.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. embedded sql update
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 02-06-14, 10:45
  2. Artikel: SQL: dynamisches Select ohne Cursor
    By NEWSolutions Redaktion in forum NEWSolutions artikel
    Antworten: 0
    Letzter Beitrag: 05-12-13, 19:03
  3. TCP/IP-Leitwege - Dynamisches Eintragen verhindern?
    By mott in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 18-09-02, 16:42
  4. EMBEDDED SQL in RPG
    By Ludger Muhmann in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 30-07-02, 10:49
  5. Embedded SQL
    By Stefan_R in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 12-10-01, 10:47

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •