PDA

View Full Version : SQLCODE -805 beim Zugriff auf ein fernes System



Seiten : [1] 2 3 4

mahones
31-03-20, 10:16
Hallo zusammen,

bei der Modernisierung eines Programmes möchte ich vom SETLL / READE (mittels einer DDMF auf eine andere IBMi) auf SQL umstellen.
Im ersten Schritt, so habe ich gelesen, ist dazu ein RDB-Verzeichniseintrag notwendig.
Diesen haben wir erstellt und anschließend bei einer neu erstellten DDMF als fernen Standort *RDB angegeben - und den Namen der relationalen Datenbank (so wie er auf dem fernen System unter *LOCAL eingetragen ist).

Ein interaktives SQL in einer 5250-Sitzung war ebenso erfolgreich wie ein SQL-Script im integrierten Editor beim iACS.

In meinem RPG-Programm klappt das aber leider NICHT.
Hier erhalte ich beim OPEN des cursors einen SQLCODE -805.

Ebenso hat eine andere Adressierung der fernen Datei nicht funktioniert:
RMTSYS.RMTLIB.RMTFILE

In meinen spool files habe ich dann auch einen Eintrag:



MSG ID WTK SATZ TEXT
SQL0204 30 *LIBNAME* der Art *LIB in QSYS nicht gefunden.
SQL5056 SQL-Paketerstellung für Modul PGMNAME fehlgeschlagen.
Paketname sollte *PGNMANE* in *LIBNAME* in *RMTSYS* sein.


Nun habe ich bereits andere Hilfestellungen dazu gefunden, konnte aber nichts damit anfangen...die Begriffe sagen mir nichts :-(
So steht auf der IBM-Seite z.B. beim SQLCODE -805:
"SQL package &1 in &2 not found at DRDA Server."
-> Was ist ein / der DRDA Server? (Lese ich auf den dazugehörigen Seiten der IBM weiter, bin ich noch verwirrter...)

Auf einer anderen Seite finde ich auch einen Artikel zu "How to analyze SQLCODE -805 (german text)" verstehe aber auch dort kaum ein Wort.

Nun hoffe ich auf wohlgesonnene Experten, die das etwas anschaulich erklären können, wie ich hier ans Ziel gelangen kann.

Ich hoffe, ich habe so ziemlich alle benötigten Infos mitgeteilt - ansonsten ergänze ich die natürlich gerne.

Danke schonmal!

BenderD
31-03-20, 11:00
... falls Du noch kein CRTSQLPKG gemacht hast, dann mal los!

D*B

mahones
31-03-20, 11:09
Danke für die erste, schnelle Rückmeldung!

Ja, das habe ich schon einmal versucht, aber auch bei der manuellen Ausführung kommen die gleichen Fehlermeldungen. Vielleicht sind da schon Parameter, die ich falsch setze...aber welche?
Die, die ich angebe, klingen schon plausibel und sind zumindest gültig.

Fuerchau
31-03-20, 12:10
Das Problem bei RPG ist, dass du auf dem Zielsystem per SQL ein SQLPKG-Objekt erstellen musst.
Dies erfolgt mittels CRTSQLPKG mit der Angabe des Zielsystems und deines RPG-Programmes.
Allerdings wird das Paket auf dem Zielsystem dann mit *PUBLIC *EXCLUDE erstellt.

Ein SQLPKG enthält ebenso eine Signatur. D.h., sobald du dein Programm änderst und SQL-Befehle hinzufügst/entfernst/änderst muss das SQLPKG neu erstellt werden.

DDMF's sind aber quasi sowieso der falsche Weg, da du dann für jeden Zugriff eine DDMF benötigst.
Du kannst aber aus dem Programm via Connect zu dem Zielsystem Verbindung aufnehmen um dann per SQL direkt mit dem Ziel zu arbeiten.
Mittels "exec sql set connection ..." kannst du zwischen Lokal und Remote fliegend wechseln.

BenderD
31-03-20, 12:14
... ich habe gerade keinen Bock auf Ratespiele. Was machst Du genau in deinem Programm? Remote SQL Zugriffe gehen nicht über DDM Files, sondern über einen connect.

D*B

Fuerchau
31-03-20, 12:28
Tja Dieter, bei DDMF mit *RDB kann man tatsächlich auch per DRDA sequentiell auf Dateien zugreifen.
Vergleichbar zu DDMF mit SNA.

BenderD
31-03-20, 12:42
... ok, dann halt präziser: das macht man so nicht! (gilt auch für den three part alias Huddel)!

mahones
31-03-20, 14:16
Danke für die Informationen und Hilfestellungen!
Ich versuche mal, das zu sortieren:
1. Ich habe im Programm nun folgendes eingebaut:
Exec SQL Connect to :LOCNAME USER :AUTHID USING :PASSWORD;
...wobei die Variablen entsprechend definiert und gefüllt sind.
Im Joblog sehe ich nun auch die Meldung "CONNECT für relationale Datenbank >DBNAME< abgeschlossen. Aktuelle Verbindung besteht zur relationalen Datenbank >DBNAME<."
=> Damit bin ich also vom SQL per DDMF weg...Schelte von D*B verstanden :-)

2. Nach der Deklaration des Cursors, also beim OPEN, bekomme ich trotzdem wieder einen -805.
=> Muss ich trotzdem "...auf dem Zielsystem per SQL ein SQLPKG-Objekt erstellen..."?
Auf dem Zielsystem ist das Programm ja gar nicht vorhanden, somit kann ich es dort nicht angeben. (es kommt ja sonst der Fehler "SQL0204 >PGMNAME< der Art *PGM in >LIBNAME< nicht gefunden."
Das Programm versucht ja auch irgendwie, dieses zu machen, es klappt aber auch nicht.

Evtl. ist das ja ne banale Frage, aber da ich damit bisher noch nie gearbeitet habe, fehlt mir da einfach die Basis, wie man es beginnt...wie funktioniert das also mit dem CRTSQLPKG?

BenderD
31-03-20, 14:29
... so der connect ist erst mal da und funzt. Beim lokalen connect wird das implizit ausgeführt, ohne dass man was programmiert.
Static sql (das ist das, was embedded SQL macht) braucht ein package. Für den lokalen Zugriff wird das an das Programm automatisch angehängt (kann man sich mit PRTSQLINF ansehen). In dem Package ist der Code für den Datenbankzugriff. Für den remote Zugriff muss das Package auf dem Zielsystem angelegt werden. Das Programm ist also "aufgeteilt" in lokal und der Datenbankcode remote.
Zu empfehlen ist hier, das Porgramm wie gehabt zu erstellen und das Package mit CRTSQLPKG zu erzeugen, hierbei gibt man im Parameter RDB die Maschine an, auf die man zugreifen will, dort wird dann das Package erzeugt.

D*B

Fuerchau
31-03-20, 15:21
Das hatte ich doch oben mit dem Hinweis CRTSQLPKG ja schon beschrieben;-).
Auf dem lokalen System:
CRTSQLPKG PGM(MYPROG) RDB(MYRDB)
Auf dem Remotesystem ggf. für das erstellte SQLPKG noch einen EDTOBJAUT durchführen, falls andere User dein Programm auch verwenden wollen oder sollen.