[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    May 2004
    Beiträge
    444

    SQL Prozedur mit Cursor als Rückgabe (Embedded SQL)

    Hallo zusammen,

    ich soll was machen was ich noch nie gemacht habe und versuche verzweifelt eine Syntax zu finden.
    Ich habe bereits Embedded SQL gemacht mit SELECT und UPDATE und auch FETCH NEXT FROM usw.
    Das ist mir bekannt.
    Jetzt ist es aber so dass uns ein externer Anbieter auf unserem System die Daten via SQL Prozedur zur Verfügung stellt. Nachdem ich den Aufruf der SQL Prozedur gesehen habe und gefragt habe wie ich das Ergebnis bekomme, wurde mir gesagt ich erhalte als Ergebnis einen Cursor.
    Soweit so gut.
    Da ich noch nie eine SQL Prozedur im RPG aufgerufen habe, dach ich ich mache das wie beim normalen Embedded SQL zum Lesen einer Datei also DECLARE CRS CURSOR FOR PROZEDUR('x', 'x', 'x'), aber so mag er das nicht.
    Kann mir da jemand weiterhelfen ?

    Viele Grüße Harald

  2. #2
    Registriert seit
    Aug 2006
    Beiträge
    2.072
    Es sollte doch wohl für den Dienstleister ein leichtes sein Dir die Syntax zu sagen bzw. die ein kleines Wrappeprogramm zu schreiben.

    Oder an welche Pappnasen bist Du da geraten.....

    GG 4002

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Frag nochmal nach! Einen Cursor zurückgeben gibt es eigentlich nicht. Ich vermute es wird ein Result Set zurückgegeben.
    Wenn das so ist, musst Du die folgenden Schritte machen:
    1. Definiere in Deinem Programm einen Result-Set-Locator
    Code:
    DCL-S YourLocator  SQLTYPE(RESULT_SET_LOCATOR);
    2. Rufe Deine Stored Procedure auf
    Code:
    Exec SQL CALL StoredProcedure(:Parm1, ... :ParmN);
    3. Weise die Result Sets den Result-Set-Locatoren mit ASSOCIATE zu
    Code:
    Exec SQL Assosiate Result Set Locator(:YourLocator) 
                       With Specific Procedure SpecificProcedureName;
    4. Deklariere einen Cursor für jeden Result-Set-Locator:
    Code:
    EXEC SQL Allocate yourCsrName Cursor For Result Set :YourLocator;
    5. Der Rest ist wie bei jedem anderen Cursor, d.h. Fetch und wenn alles verarbeitet ist muss der Curosor (YourCsrName) geschlossen werden.
    Code:
        Exec SQL Fetch Next from YourCsrName into :DS;
        Exec SQL Close YourCsrName;
    Noch eine Anmerkung, Arbeit mit Lokatoren/Locators muss unter Commitment Control erfolgen!

    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
    May 2004
    Beiträge
    444
    Uhh Birgitta, vielen Dank. Ich habe was ähnliches bereits im Internet an anderer Stelle gefunden aber das hat nicht so funktioniert. Ich probiere deines morgen gleich aus.

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Hier habe ich sogar noch einen Link zu einem Artikel in Deutsch! gefunden:
    Release 7.1 – Verarbeiten von Result Sets mit embedded SQL

    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

  6. #6
    Registriert seit
    May 2004
    Beiträge
    444
    @Birgitta Was ist der SpecificProcedureName
    Ich denke dass ist der normale StoredProcedure Name

  7. #7
    Registriert seit
    May 2004
    Beiträge
    444
    Ich habe alles soweit gemacht. Bekomme aber jetzt den SQLCOD -501.
    Im Joblog sagt er dass er die Datei (sehr langer Name) nicht findet.
    Über WRKOBJ sehe ich nur die 10-stelligen Systemnamen. Kann es sein dass ich irgendwo noch was angeben muss und das der lange Name eventuell das Problem ist ?

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Da Prozeduren überladen werden können, d.h. die gleiche Prozedur (bzw. gleicher Prozedur-Name) jedoch mit einer unterschiedlichen Anzahl von Parametern kann in der gleichen Bibliothek mehrfach vorhanden sein. Um an dieser Stelle auch die richtige Prozedur aufzurufen verwendet man den spezifischen (eindeutigen) Namen der Prozedur, alternativ kann man and dieser Stelle aber auch die Parameter-Definition angeben.
    Wenn es nur eine einzige Stored Procedure (mit dem gleichen Namen) gibt, kannst Du an dieser Stelle auch den Namen der Stored Procedure angeben.

    SQL-Code -501 bedeutet, dass der Cursor nicht geöffnet ist.

    Wenn Du die Stored Procedure aus ACS (Access Client Solutions) - Run SQL Skript (oder auch mit Client Access) mit dem SQL-Befehl CALL aufrufst, bekommst Du dann eine Ergebnis-Tabelle angezeigt oder erhältst Du eine Fehlermeldung?

    Wo genau (nach welchem Statement) erhälst Du den SQLCODE -501?

    Um ein Result-Set auszugeben, muss der entsprechende Cursor in der Stored Procedure geöffnet werden und darf vor Ende der Prozedur nicht mehr geschlossen werden. (Das machst Du nämlich dann in Deinem Verarbeitungs-Programm).
    Ich vermute der Programmierer hat entweder nur den Cursor definiert (darauf können wir nicht zugreifen) und nicht geöffnet (dann können wir das Result-Set verarbeiten).
    Oder er hat den Cursor geöffnet, aber sicherheitshalber vor dem Ende der Prozedur wieder geschlossen.

    Im übrigen solltest Du mit ACS (Access Client Solutions) Datenbank - Schemas und/oder Run SQL Script arbeiten. Mit ACS Schemas kannst Du Dir alle Datenbanken-Objekte anschauen, hier siehst Du auch die langen System und kurzen SQL-Namen.
    Mit Run-SQL Script (ich hab' nur die Englische Version) führst Du SQL-Statements aus. Bei der aktuellen Version gibt es keine Ausrede mehr, warum STRSQL (das bereits seit Release V4R5 stabilisiert ist) verwendet werden sollte.

    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Mittels DSPFD kann man auch den Alias-Namen sehen.
    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
    May 2004
    Beiträge
    444
    Ich glaube die Datei existiert tatsächlich nicht. Das ist wieder so ein Berechtigungsproblem ... vielleicht. Ich weiß nicht warum die das so kompliziert machen müssen. Um nicht viele Prozeduren machen zu müssen habe die eine Prozedur gemacht die aus einer Datei das SQL Statement holt und dieses dann ausführt und das Ergebnis zurück gibt. Somit sind fast alle Felder auch varchar(250). Ich weiß das hat mit meinem Problem nichts zu tun, macht es aber nicht einfacher.
    Er bringt beim CALL auf der AS400 direkt dass er die Datei nicht findet.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Welchen CALL meinst du denn?
    Hast du Birgittas Vorschlag mal angenommen und den Call auf die Prozedur von ACS oder falls noch nicht installiert mit Operations Navigator durchgeführt?
    Kann dir nicht derjenige, der die Prozedur zur Verfügung stellt, ein Beispiel für das Erhalten der Daten bereitstellen?

    Auch wenn es ungern gesehen wird:
    Klappt der Aufruf mit STRSQL und du siehst Daten?
    Wenn Ja, dann gibts noch die Umgehung mit QMQRY.
    Da kannst du die Daten der Prozedur in eine Datei ausgeben und dann verarzten.
    Das tut zwar manchen in den Augen weh, mag aber funktionieren.
    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
    May 2004
    Beiträge
    444
    Aktuell funktioniert es soweit dass ich was zurück bekomme. Probleme machen noch die Null-Felder ich muss noch die Null-Felder-Variablen empfangen.
    Mit Einzelfelder hatte ich da bisher keine Probleme jetzt bekomme ich aber eine DS zurück

    d DsWR ds
    d Row_Key 250
    d Commission_Number...
    d 250
    d Commission_Number_Year...
    d 250
    d Vin 250
    d Invoice_Number...
    d 250

    Wie muss ich die Null-Variablen definieren ?
    als eigene DS mit je einem Null-Feld je Feld oder muss ich die einzelenen Nullfelder in die gleiche DS hinter die Felder machen ?

Similar Threads

  1. Aufruf SQL Prozedur von SQLRPGLE
    By Dschainers in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 28-08-19, 12:09
  2. Embedded SQL Cursor updaten
    By Tschabo in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 23-10-16, 20:12
  3. RPG-Prozedur aus C# aufrufen
    By svit in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 03-03-16, 12:11
  4. telnet - rückgabe im ebcdic
    By sargejogi in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 22-09-15, 13:09
  5. CLLE als Prozedur ins Serviceprogramm
    By Etherion in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 30-09-14, 14:36

Berechtigungen

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