[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Jun 2009
    Beiträge
    128

    dynamisches SQL mit Clob möglich?

    Hallo zusammen,

    offensichtlich kann man EXECUTE IMMEDIATE mit zusammengebauten String im embedded SQL nicht verwenden, wenn die Datei ein Clob Feld enthält und man beim INTO eine Variable die ein XML_CLOB_FILE ist verwendet

    DCL-S XmlDoc SQLTYPE(XML_CLOB_FILE)

    EXEC SQL
    SELECT XMLDOCUMENT(XMLGROUP(
    FELDA as "Erstes"
    FELDB as "Zweites"
    FELDC as "Drittes"
    ))
    INTO :XmlDoc From MyFile;

    Hat jemand eine Idee, wie ich die Feldauswahl im Select und die Auswahl des From Files (oder natürlich den kompletten SQL-String) variabel halten kann?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Execute Immediate geht da leider nicht.
    Du musst den Umweg über einen Cursor mit Open/Fetch/Close nehmen.
    Per Declare Cursor for Statement und Prepare machst du einen dynamischen Cursor.
    Dein Fetch kann dann wieder statisch sein solange die Ergebnisspalten passen.
    Wie in deinen anderen Threads schon beschrieben musst du aber hier den Umweg über CLOB_LOCATOR gehen und kannst dann den Inhalt in eine CLOB_FILE kopieren.
    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
    Jun 2009
    Beiträge
    128
    Ich muß leider nochmal nachfragen:
    - Clob-Locator definieren ist klar
    - DECLARE CURSOR für den auszuführenden SELECT. ok.
    - OPEN vom Cursor. auch ok.
    - Dann FETCH vom Cursor. Bei into den CLob-Locator verwenden, korrekt?
    Fehlt noch was?

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Nach dem Fetch mit einem "exec sql Set ...;" den Lob-Locator dann auslesen, a) Hostvariable, b) xLOB_FILE.
    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

  5. #5
    Registriert seit
    Jun 2009
    Beiträge
    128
    Danke! Nach etwas Kampf mit der Definition des Locators läuft's jetzt.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Nun wäre es noch nett, wenn du die funktionierende Lösung (zumindest den SQL und RPG-Teil) hier darstellen und erklären würdest. Dies könnte anderen dann ebenso hilfreich sein.
    Ich steuere ledglich Denkanstöße bei, zum Programmieren solcher Aktionen fehlt mir einfach die Zeit.
    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

  7. #7
    Registriert seit
    Jun 2009
    Beiträge
    128
    Ja, gerne.

    1.) Definieren der XML-CLOB-Datei (Streamfile im IFS), eines XML-CLOB Felds als Host-Variable und des Locators als Zeiger.

    DCL-S IXMLDoc SQLTYPE(XML_CLOB_FILE);
    DCL-S IXMLDta SQLTYPE(XML_CLOB:1024);
    DCL-S IXMLLoc SQLTYPE(XML_LOCATOR);

    2.) Setzen des Zielpfads und des Dateinamens im IFS, durch die CLOB-Datei Definitionsfelder

    DCL-S Xmlpath char(30) inz('/mydir/sql/out/');

    IXMLDoc_Name = %trim(Xmlpath) + %trim(FileGroup) + '_' +
    %trim(FileId) + '.xml';
    IXMLDoc_NL = %Len(%Trim(IXMLDoc_Name));
    IXMLDoc_FO = SQFOVR;

    3.) Bauen des Selektions-Strings in einer Variablen

    sqlstring = 'SELECT XMLDOCUMENT(XMLGROUP(TRIM(Fielda) AS "Host", +
    TRIM(Fieldb) AS "Environ", TRIM(Fieldc) AS "Country" +
    OPTION ROW "Testrow" ROOT "Testroot")) FROM File';

    4.) SQL optionen nach Bedarf setzen

    EXEC SQL
    Set Option Datfmt=*iso, TimFmt=*iso,Naming=*sys,
    CloSQLCsr=*EndActGrp;

    5.) SQL Cursor definieren unter Verwendung der obigen Variablen

    EXEC SQL
    PREPARE selectstm FROM :sqlstring;

    6.) Statisch können dann der SQL DECLARE, OPEN des Cursors, FETCH und SET bleiben.
    EXEC SQL
    DECLARE INXML CURSOR FOR selectstm;
    EXEC SQL
    OPEN INXML;
    EXEC SQL
    FETCH NEXT FROM INXML
    INTO :IXMLLoc;
    EXEC SQL
    SET :IXMLDta = :IXMLLoc;
    EXEC SQL
    SET :IXMLDoc = :IXMLLoc;
    EXEC SQL
    CLOSE INXML;



  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Da ein Locator einen SQL-internen Speicherbereich belegt so musst du, wenn du ihn nicht mehr benötigst, mittels "FREE LOCATOR : MyLoc;" auch wieder freigeben.
    Ansonsten läuft dein temporärer Speicher ziemlich voll. Wenn das viele Jobs machen und jeder Job mal so eben 1000de Lobs á 1GB erstellt ist abzusehen, wann deine AS/400 runterfährt.
    Ein Fetch in einen belegten Locator impliziert keine Freigabe.
    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

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Execute Immediate geht da leider nicht.
    Du musst den Umweg über einen Cursor mit Open/Fetch/Close nehmen.
    Per Declare Cursor for Statement und Prepare machst du einen dynamischen Cursor.
    Dein Fetch kann dann wieder statisch sein solange die Ergebnisspalten passen.
    Wie in deinen anderen Threads schon beschrieben musst du aber hier den Umweg über CLOB_LOCATOR gehen und kannst dann den Inhalt in eine CLOB_FILE kopieren.
    ... der execute immediate scheitert daran, dass keine Variablen verwendet werden können. Prepare mit nachfolgendem execute using sollte allerdings auch ohne cursor und fetch ebenfalls gehen.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    "Execute ... Using" gilt leider nur für Parametermarker.

    MyStmt = "Select ... where f1=?";
    prepare ...
    execute ... using MyVar;

    Um Ergebnisse zu erhalten geht das nur per Descriptor (SQLDA mit SQLVAR-Array).
    Wer sich das zutraut kann das verwenden. Dies ist dann vielleicht schneller als Open/Fetch/Close.
    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

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    "Execute ... Using" gilt leider nur für Parametermarker.

    MyStmt = "Select ... where f1=?";
    prepare ...
    execute ... using MyVar;

    Um Ergebnisse zu erhalten geht das nur per Descriptor (SQLDA mit SQLVAR-Array).
    Wer sich das zutraut kann das verwenden. Dies ist dann vielleicht schneller als Open/Fetch/Close.
    ... den select into kann man auch mit einer SQLDA nicht dynamisch preparen, aber values into kann man dynamisch preparen, auch ohne SQLDA. Performance relevant ist das so oder so nicht, da der Declare cursor eine Compiletime Geschichte ist, die Musik spielt beim prepare und beim open/fetch versus execute using könnte die typisierte variante (mit SQLDA) sogar im Vorteil sein - allerdings legt das alles im Bereich unterhalb der Messbarkeitsgrenze.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    Jun 2009
    Beiträge
    128

    Smile

    Danke für die Tips. Mal wieder was gelernt...

Similar Threads

  1. Clob to Blob
    By dschroeder in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 31-08-16, 16:32
  2. Inhalt CLOB Feld in IFS-Datei
    By alex61 in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 06-07-16, 12:51
  3. Textteil ersetzen in CLOB - Feld
    By alex61 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 09-06-16, 14:26
  4. SQL-Anweisung UPDATE auf CLOB-Spalte mit einer Zeichenfolge >32K
    By Joshua in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 24-11-15, 11:53
  5. Dynamisches SQL bauen in RPG
    By labm in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 07-05-15, 08:55

Tags for this Thread

Berechtigungen

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