[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    May 2002
    Beiträge
    1.121
    Hallo Dietlinde,

    mache vorher einfach einen OVRDBF
    PHP-Code:
    dcl-pr System int(10extproc('system');
     *
    n pointer value options(*string);     
    end-pr;                                 

    System'ovrdbf Datei ' + %Trim(MyLib) +'/SAPASOP' );   
    Exex SQL
      SET 
    :SZAZ =(SELECT MAX(#XKEY#) FROM DATEI WHERE #INKEY# > 0); 
    Gruß
    Ronald

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Das ist eine der schlechtesten Lösungen;-) da sie nicht SQL-Konform ist.
    OVRDBF's sollte (und muss) man in SQL vermeiden, da eine Tabelle ja durchaus geöffnet bleibt und mit dieser weitergearbeitet wird auch wenn man den OVRDBF wieder löscht.
    Das selbe gilt ebenso für CHGLIBL zur Laufzeit.

    Der richtige Weg wäre ein dynamischer SQL per "Execute Statement".
    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
    316
    z.B.

    d sqlstm s 1024a varying
    d wrkfile s 20a inz('QTEMP/TESTFILE')
    /Free
    sqlstm = 'CREATE Table ' + %trim(wrkfile) +
    ' as +
    (select * from test) +
    with data ';

    /End-Free
    c/exec sql
    c+ execute immediate :sqlstm
    c/end-exec
    c move *on *inlr

  4. #4
    Registriert seit
    Nov 2009
    Beiträge
    208
    Zitat Zitat von Dschainers Beitrag anzeigen
    z.B.

    d sqlstm s 1024a varying
    d wrkfile s 20a inz('QTEMP/TESTFILE')
    /Free
    sqlstm = 'CREATE Table ' + %trim(wrkfile) +
    ' as +
    (select * from test) +
    with data ';

    /End-Free
    c/exec sql
    c+ execute immediate :sqlstm
    c/end-exec
    c move *on *inlr
    Und wo landet das Ergebnis?

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Welches Ergebnis?
    Dieses Ergebnis ist eine neue Tabelle!
    Ich weiß auch nicht, was dies mit deiner Frage zu tun hat.

    Deine Anfrage geht nur mit einem dynamischen Cursor (ohne Exec SQL):

    D MyOpen S 1000 varying

    MyOpen = 'Select blabla ....';
    prepare statement from : MyOpen;
    declare OpenCursor cursor for MyOpen;
    open OpenCursor;
    fetch OpenCursor into : MyVar;
    close OpenCursor;
    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

  6. #6
    Registriert seit
    Jun 2009
    Beiträge
    316
    Ich wollte nur aufzeigen, wie man ein variables SQL Statement zusammenbaut.
    Da dies anscheinend noch nicht bekannt war.

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Welches Ergebnis?
    Dieses Ergebnis ist eine neue Tabelle!
    Ich weiß auch nicht, was dies mit deiner Frage zu tun hat.

    Deine Anfrage geht nur mit einem dynamischen Cursor (ohne Exec SQL):

    D MyOpen S 1000 varying

    MyOpen = 'Select blabla ....';
    prepare statement from : MyOpen;
    declare OpenCursor cursor for MyOpen;
    open OpenCursor;
    fetch OpenCursor into : MyVar;
    close OpenCursor;
    statement Name im declare und prepare müssen matchen, also:

    exec sql declare OpenCursor cursor for MyOpen;
    exec sql prepare MyOpen from : MyOpen;

    D*B,

    dem sich bei Datenbank und LIBL der Magen rumdreht. Besser wäre, Namimg *SQL und die Umgebung über das default Schema zu steuern.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    May 2002
    Beiträge
    1.121
    Zitat Zitat von Dschainers Beitrag anzeigen
    z.B.

    d sqlstm s 1024a varying
    d wrkfile s 20a inz('QTEMP/TESTFILE')
    /Free
    sqlstm = 'CREATE Table ' + %trim(wrkfile) +
    ' as +
    (select * from test) +
    with data ';

    /End-Free
    c/exec sql
    c+ execute immediate :sqlstm
    c/end-exec
    c move *on *inlr
    genau das hatte ich bei mir mit dem SET gestestet. Und es hat bei mir nicht funktioniert. Deshalb bin ich auf dem OVRDBF gekommen

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Was soll den ein "Create Table" für eine Set-Anweisung zurückliefern?
    Das wäre mir aber neu;-).
    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

  10. #10
    Registriert seit
    Oct 2013
    Beiträge
    171
    Die Frage, wie man Werte aus einem dynamischen SQL herauskitzeln kann, wurde aber nicht beantwortet.

    Code:
    D #SQL            S           5000A   VARYING                  
     *                                                             
    D #LIB            S             10A   INZ('QTEMP')             
    D #FILE           S             10A   INZ('TEST')              
     *                                                             
    D #Anz1           S             10P 0                          
                                                                   
     /FREE                                                         
            #SQL = 'VALUES( +                                      
                      SELECT COUNT(*) FROM ' + %TRIMR(#LIB) + '/' +
                                               %TRIMR(#FILE) +     
                         ') +                                      
                    INTO ?';                                       
                                                                   
        EXEC SQL PREPARE Stmt1 FROM :#SQL;                         
                                                                   
        EXEC SQL EXECUTE Stmt1 USING :#Anz1;                       
                                                                   
     /END-FREE
    von Scott Klement abgeschaut; z.B. hier noch komplexer:
    https://www.ibm.com/developerworks/c...8-94cd018d1560

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.254
    Wenn du mein obiges (von Dieter korrigiertes) Beispiel anschaust, siehst du das sehr wohl.
    Nur mit dem Unterschied, dass per Cursor Resultsets und mehr als 1 Wert übergeben werden können.
    So verfahre ich z.B. bei embedded SQL via ArdGate um Daten aus Oracle oder SQL-Server direkt im Programm zu erhalten.

    Scotts Beispiele aus dem Link beschränken sich da auf 1 Satz per Values, was einem "select blabla into .... from ..." entspricht.
    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

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.877
    Scotts Beispiele aus dem Link beschränken sich da auf 1 Satz per Values, was einem "select blabla into .... from ..." entspricht.
    Wenn ein SET-Statement in Verbindung mit einem SELECT-Statement ausgeführt wird, muss genau eine Zeile zurückkommen. Das war die Ausgangssituation!

    Wenn man das Ganze dynamisch machen möchte bzw. muss (weil die Tabelle oder Bibliothek flexibel gehalten werden müssen), kann man entweder
    • ein VALUES ... INTO Statement dynamisch zusammensetzen und dann mit PREPARE und EXECUTE ausführen, wie es AG1965_2 gezeigt hat oder
    • Verwendet einen Cursor, d.h. man bildet das dynamische SELECT-Statement, konvertiert dieses in ein ausführbares SELECT-Statement (PREPARE). Das konvertierte SELECT-Statement wird dann in das DECLARE-Statement eingebunden und danach folgt der übliche Verlauf, d.h. der Cursor muss geöffnet werden (OPEN), der einzelne/erste Datensatz gelesen werden (FETCH) und dann muss der Cursor wieder geschlossen werden (CLOSE).


    Weder SET noch SELECT ... INTO können in Verbindung mit dynamischem verwendet werden.

    Die Frage ist nur, warum sollte man an dieser Stelle 5 SQL-Statements ausführen, wenn man stattdessen mit 2 Statements auskommen kann?
    Nein, ich habe mich nicht verzählt, das SQL-Statement kann auch direkt im PREPARE zusammengesetzt werden!

    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

Similar Threads

  1. FUJIFILM Imaging Germany, GEWA music und die Igepa group setzen auf AS400 Software
    By Rhenania Computer in forum NEWSboard Server Software
    Antworten: 0
    Letzter Beitrag: 31-08-16, 15:38
  2. security level auf 40 setzen
    By dibe in forum IBM i Hauptforum
    Antworten: 19
    Letzter Beitrag: 21-12-15, 22:48
  3. Cursorposition setzen
    By thluetjen in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 31-01-08, 10:21
  4. Variable
    By Henrik Motzkus in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-03-02, 09:13
  5. High Tech-Unternehmen setzen weiter auf i2
    By W.Steiner in forum Archiv NEWSblibs
    Antworten: 0
    Letzter Beitrag: 05-07-01, 09:55

Berechtigungen

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