PDA

View Full Version : SQL Prozedur mit Cursor als Rückgabe (Embedded SQL)



Seiten : [1] 2

harkne
15-06-20, 13:59
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

KingofKning
15-06-20, 14:52
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

B.Hauser
15-06-20, 15:01
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

DCL-S YourLocator SQLTYPE(RESULT_SET_LOCATOR);
2. Rufe Deine Stored Procedure auf

Exec SQL CALL StoredProcedure(:Parm1, ... :ParmN);
3. Weise die Result Sets den Result-Set-Locatoren mit ASSOCIATE zu

Exec SQL Assosiate Result Set Locator(:YourLocator)
With Specific Procedure SpecificProcedureName;
4. Deklariere einen Cursor für jeden Result-Set-Locator:

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.

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

harkne
15-06-20, 15:42
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.

B.Hauser
15-06-20, 16:05
Hier habe ich sogar noch einen Link zu einem Artikel in Deutsch! gefunden:
Release 7.1 – Verarbeiten von Result Sets mit embedded SQL (https://midrange.de/release-7-1-verarbeiten-von-result-sets-mit-embedded-sql/)

Birgitta

harkne
16-06-20, 07:30
@Birgitta Was ist der SpecificProcedureName
Ich denke dass ist der normale StoredProcedure Name

harkne
16-06-20, 08:08
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 ?

B.Hauser
16-06-20, 08:57
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

Fuerchau
16-06-20, 09:03
Mittels DSPFD kann man auch den Alias-Namen sehen.

harkne
16-06-20, 09:08
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.