[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2015
    Beiträge
    18

    Question SQL: Select nicht seitenweise ausführen

    Hallo zusammen,

    eine select-Anweisung wird ja immer(?) seitenweise ausgeführt bzw. beim Vorwärtsblättern bzw. -scrollen wird weiter gelesen.
    Im STRSQL ist das eine Bildschirmseite, im ACS-SQL-Skript-Editor sind das 102 Sätze, die selektiert werden. Dann muss jeweils geblättert bzw. gescrollt werden.
    Kann ich irgendwie steuern, dass der Select gleich bis zum Ende durchgeführt wird?

    Hintergrund: im Select führe ich eine Funktion, die nicht nur ein Ergebnis zurückliefert, sondern auch noch weitere Daten schreibt bzw. Anweisungen erledigt.
    Da mein Select 792 Sätze findet, sprich die Funktion 792 mal ausgeführt werden soll, ist es nervig, wenn ich immer bis zum Ende blättern oder scrollen muss, bis alles erledigt ist.

    Noch schlimmer: dieser Select ist eine Anweisung eines SQL-Skript. Die Anweisungen dieses Skripts möchte ich alle nacheinander im ACS-Skript-Editor ausführen. Dann funktioniert es gar nicht.

    Hat jemand eine Idee?

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Aktuell gibt es keinen Button oder Funktionstaste oder sonstigen Befehl durch den erzwungen werden kann, dass bei einem SELECT-Statement alle Datensätze gelesen werden.

    Schreib' dir eine Stored Procedure oder führe eine dynamsiche Prozedur (BEGIN ... END - und dazwischen SQL-Befehle), in der ein Cursor definiert wird, über den das SQL-Statement komplett verarbeitet wird. Damit sollten dann Deine Funktionen alle ausgeführt werden.

    ... warum führst Du ein Skript aus, anstatt den completten SQL Code in eine Stored Procedure zu packen und diese dann auszuführen. Dann kannst Du auch Deinen SELECT sauber verarbeiten.

    ... im übrigen ist es keine besonders gute Idee Updates in UDFs auszuführen.

    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

  3. #3
    Registriert seit
    Aug 2006
    Beiträge
    2.074
    Ein select count(*) hilft nicht?

    ... im übrigen ist es keine besonders gute Idee Updates in UDFs auszuführen.

    Tja, hätte ich eine Schulung in SQL gehabt würde ich soetwas auch nicht machen. Aber für meine Sachen benutze ich das auch, weil schneller als ein Cobol Programm zu schreiben.

    GG 4203

  4. #4
    Registriert seit
    Dec 2015
    Beiträge
    18
    danke für Euren zahlreichen Tips.

    "im übrigen ist es keine besonders gute Idee Updates in UDFs auszuführen.
    "
    -> Tatsächlich mache ich keinen Update in der UDF, sondern einen create table sowie einen insert in eine Log-Datei. Ich erstelle also mit meiner Select Anweisung 792 Tabellen und protokolliere die Create Table-Anweisung in einer Log-File.

    "warum führst Du ein Skript aus
    ?" -> weil ich im ACS-SQL-Skript-Editor schön den Fortschritt beim Abarbeiten der einzelnen Schritte sehe. Oder bei Bedarf kann ich zum Testen auch nur einen oder 3 oder 5 Schritte ausführen. Tolle Funktionalität im ACS :-)

    "Ein select count(*) hilft nicht?"
    -> leider nein, da ich Felder der Tabelle, auf die der Select geht, an die Funktion weiterreiche

    "Schreib' dir eine Stored Procedure oder führe eine dynamsiche Prozedur (BEGIN ... END - und dazwischen SQL-Befehle), in der ein Cursor definiert wird, über den das SQL-Statement komplett verarbeitet wird. Damit sollten dann Deine Funktionen alle ausgeführt werden."
    -> den Cursor lese ich dann per Fetch?

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Ja! Du verarbeitest einen ganz normalen Cursor:
    DECLARE, OPEN, FETCH, CLOSE
    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

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von JotSo Beitrag anzeigen
    danke für Euren zahlreichen Tips.

    "im übrigen ist es keine besonders gute Idee Updates in UDFs auszuführen.
    "
    -> Tatsächlich mache ich keinen Update in der UDF, sondern einen create table sowie einen insert in eine Log-Datei. Ich erstelle also mit meiner Select Anweisung 792 Tabellen und protokolliere die Create Table-Anweisung in einer Log-File.

    "warum führst Du ein Skript aus
    ?" -> weil ich im ACS-SQL-Skript-Editor schön den Fortschritt beim Abarbeiten der einzelnen Schritte sehe. Oder bei Bedarf kann ich zum Testen auch nur einen oder 3 oder 5 Schritte ausführen. Tolle Funktionalität im ACS :-)

    "Ein select count(*) hilft nicht?"
    -> leider nein, da ich Felder der Tabelle, auf die der Select geht, an die Funktion weiterreiche

    "Schreib' dir eine Stored Procedure oder führe eine dynamsiche Prozedur (BEGIN ... END - und dazwischen SQL-Befehle), in der ein Cursor definiert wird, über den das SQL-Statement komplett verarbeitet wird. Damit sollten dann Deine Funktionen alle ausgeführt werden."
    -> den Cursor lese ich dann per Fetch?
    ... eigentlich brauchst Du da keinen Fetch. Sieh Dir mal das Beispiel in der SQL Reference an:
    BEGIN
    DECLARE fullname CHAR(40);
    FOR vl AS
    c1 CURSOR FOR
    SELECT firstnme, midinit, lastname FROM employee
    DO
    SET fullname =
    lastname || ', ' || firstnme ||' ' || midinit;
    INSERT INTO TNAMES VALUES ( fullname );
    END FOR;
    END;

    Aufpassen must Du mit dem error Handling, das ist etwas hakelig. Ohne Continue Handler düst du da unversehens aus der Stored procedure raus.

    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/

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Das "Blocken" kommt aus der Connection-Eigenschaft des jeweiligen Treibers (außer dem lokalen). Hier kann man die Blocksize erhöhen um die Anzahl Sätze je Block zu vergrößern.
    Deshalb sind es bei kurzen Sätzen mehr Zeilen als bei langen Sätzen.
    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. SELECT INTO .....
    By alex61 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 12-07-16, 10:23
  2. Antworten: 1
    Letzter Beitrag: 10-09-15, 18:33
  3. select into wie fetch next
    By Robi in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 22-05-15, 08:31
  4. Antworten: 2
    Letzter Beitrag: 19-05-15, 11:21
  5. SQL Select
    By TARASIK in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 19-09-02, 11:59

Berechtigungen

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