View Full Version : SQL Zugriff auf 2 Systeme
dschroeder
20-10-21, 17:15
Hallo,
wir haben 2 IBM i Systeme. Ich würde gerne per SQL Daten von dem einen System auf das andere übertragen. Konkret würde ich gerne eine Tabelle auf System 1 lesen und die Daten in eine gleichartige Tabelle auf dem System 2 schreiben.
Wenn die beiden Tabellen auf einem System in 2 unterschiedlichen Bibliotheken ständen, wäre das ja kein Problem und mit einer SQL-Anweisung machbar. So etwas geht wohl nicht, wenn die beiden Tabellen auf unterschiedlichen Systemen sind, oder? Mit einer DDMF hat es schon mal nicht geklappt.
Natürlich gibt es Wege, mit denen das geht. Z.B. die Tabelle sichern und auf dem anderen System wieder einspielen. Das hat aber den Nachteil von Sperrungen.
Oder mit einem RPG-Programm, dass mit SET CONNECTION arbeitet. Dann müsste ich es jedesmal speziell programmieren.
ich würde das gerne im interaktiven SQL ausführen. Geht das?
Dieter
... mit einigen Einschränkungen ist da was machbar. Mit 3 part alias kann man einen remote select per insert into in eine lokale Datei leiten, dabei darf aber der remote select keine direkte Referenz ( in der where clause oder join clause) auf lokale Daten nehmen. Das geht schon seit (gefühlt) 1870 mit qmqry mit Angabe eines lokalen outfiles.
D*B
Per WRKRDBDIRE das Zielsystem als Datenbank registrieren.
Dann kann ein kleines ILERPG per Cursor in eine DS lesen und aus der DS einen Insert machen.
Der Zugriff besteht dann aus 3 Teilen:
Entweder: select * from RDBNAME.SCHEMA.TABLE
oder: insert into RDBNAME.SCHEMA.TABLE values (: Ds)
Gefühlt mache ich das schon seit R4V5 so.
Ein "Insert into ... Select from ..." funktioniert nicht über 2 Systeme.
Übrigens: Ich habe da mal ein kleines JavaCopy geschrieben, dass genau dies macht. Es werden lediglich Quell und Zieltabelle angegeben.
manuel.marcos
21-10-21, 08:26
Schau dir mal DBeaver an, wenn es interaktiv sein soll. Da kannst du das Ergebnis exportieren und als Ziel auch eine andere Datenbankverbindung wählen.
Gruß,
Manuel
Ein "Insert into ... Select from ..." funktioniert nicht über 2 Systeme.
wie wärs mit:
STRQMQRY OUTPUT(*OUTFILE)
OUTFILE(MYLIB/MYFILE)
RDB(MYRDB)
genau das (und nicht mehr) kann sql seit ein paar releases auch mit three part alias
INSERT into mylib.myfile
select ... from myrdb.mylib.myfile
login daten kann man da auch noch mit addsvraute hinterlegen.
D*B
Das Problem von QMQRY ist, dass nicht mehr als 255 Spalten unterstützt werden.
Aber wenn es reicht...
... die three part alias variante hat diese Einschränkung nicht. Der Punkt ist allerdings bei allen Billigheimer-Varianten, dass das mit constraints schief gehen kann (Satz bereits vorhanden etc. ...)
D*B
dschroeder
21-10-21, 10:21
Vielen Dank für eure Antworten und Ideen.
Es ist mir klar, dass es diverse Wege gibt, wenn man Programmierung nutzt. Ich muss ab und zu mal Kleinigkeiten zwischen unserem Testystem und dem Echtsystem hin und her kopieren. Das sind immer sehr individuelle Dinge, die ich am schnellsten im interaktiven SQL (wir nutzen dbVisualizer) machen könnte, wenn man die beiden System so ansprechen könnte, wie man das bei unterschiedlichen Bibliotheken machen würde.
Ich glaube, die Idee von Dieter Bender geht in die Richtung, die mir vorschwebt. Ich muss da mal etwas forschen, wie kompliziert das ist.
LG,
Dieter
Kompliziert ist das nicht. Es geht da aber nur per QMQRY, da die Ausgabedatei nicht per 1-Schritt-SQL gefüllt wird.
Du kannst dir dafür auch ein CMD erstellen und den Rest im CLP zusammenstoppeln.
Da QMQRY einen Parameter bis 54 Zeichen kann, reicht da ein "&P1", bei mehr dann halt "&P1 &P2".
Immerhin kann man ja nun im CLP auch direkte per RUNSQL dann den "Insert .. Select .." ausführen.
dschroeder
21-10-21, 11:28
Ach so, ich kann also nicht einfach "etwas" einrichten und dann mit interaktivem SQL (z.B. unser dbVisualizer) per qualifiziertem Namen auf beide Systeme gleichzeitig zugreifen?
Dann hat sich das für mich erledigt.