-
SQL Verknüpfung Sätze Datei AS400 und Table fremder DB z.B. PostGreSql
Hallo zusammen,
gibt es eine Möglichkeit, in einem SQL-Befehl (oder View o.a.) Daten aus einer AS400-Datei mit Daten aus einer Fremd-DB zu verknüpfen, und zwar "Performant" ???
Hintergrund
Ich habe auf einem WinServer eine PostGreSQL-Datenbank, Zugriff über das JVAGATE von Dieter Bender und RPG-Programmen.
Der "alleinige" Zugriff auf die PostGres-Daten oder qualifiziert, hier z.B. mit einer Kundennr., läuft super und auch performant.
Das Ganze läuft bei mir in einer Weboberfläche mit IBM Net.Data, ich lese mit SQL die Daten aus der AS400-Datei, dann rufe ich das RPG-Programm auf, das gibt mir die Daten aus der PostGreSQL-Tabelle als Net.Data-Tabellenobjekt zurück, und ich "mische" die Daten der Net.Data Ergebnistabelle aus dem SQL und dem Aufruf des RPG-Programmes.
Beide Datenbanken, also db2/i und PostGreSQL, mit reiner "Net.Data SQL-Funktionalität" zu verarbeiten ist leider nicht möglich, verständlich, ein Programm kann sich für einen SQL-Zugriff auch nur mit einer DB "gleichzeitig" verbinden.
Jetzt aber muss ich n-Kunden per SQL aus der AS400 lesen, und dabei, zumindest jetzt im 1.Schritt, würde ich gerne mit einem "Subselect" im SQL-Befehl aus Net.Data heraus das Ergebniss aus einem "Select count(*) from PostGres" in die Ergebnistabelle einbinden.
In Sachen "eigener SQL-Function" oder "Procedur" bin ich jetzt nicht der "Erfahrenste", aber ich denke in die Richtung könnte es vielleicht funktionieren ?!?!?!
Kann mir jemand sagen, ob überhaupt, und wenn ja, wie das realsiert werden kann ???
Vielleicht die liebe Birgitta ???
Danke vorab und schon einmal "Frohe Ostern" !
Peet
-
Per SQL ist ein direkter Zugriff auf 2 verschiedene Datenbanken leider nicht vorgesehen.
Es klappt weder ein "insert into ... select ... from " noch ein Join.
Du hast da leider nur die Möglichkeit, die Daten zwischen den DB's über eigene Tabellen zu synchronisieren.
Eine Prozedur oder auch Table-Function kann da zwar helfen, wird aber i.d.R. nicht performant sein, da ja die Where-Klausel u.U. nicht klappt.
Und wer behauptet denn sowas "ein Programm kann sich für einen SQL-Zugriff auch nur mit einer DB "gleichzeitig" verbinden."?
Natürlich kann man sich durchaus gleichzeitig mit mehreren DB's verbinden.
Dafür gibt es
a) "Connect to" zur Ziel-Datenbank
b) "Connect reset" zur lokalen Datenbank
Diese Befehle können beliebig oft wiederholt werden, wobei der Connect To nur beim 1. Aufruf tatsächlich eine neue Verbindung erstellt.
Geschlossen werden die Verbindungen erst am Ende.
Es gibt allerdings noch eine 2. Möglichkeit:
Ein Tabellenname ist eigentlich 3-teilig:
- DBName/Schema/Table
- DBname.Schema.Table
je nach Namenskonvention.
Da die Namenskonvention aber für das Gesamtprogramm gilt und andere DB's eher selten mit "/" zurechtkommen, bietet sich halt Naming=*SQL eher an.
Somit kann man mit:
select * from MyLib.MyTable
bzw.
select * from DestDB.Schema.Table
unter Umgehung des Connects aus beliebigen DB's innerhalb des Programmes lesen.
Per "CREATE ALIAS MYLIB/MYTABLE FOR DestDB.Schema.Table" kann man das noch anonymisieren.
Für das JVAGATE/ArdGate kann man in der Konfiguration einen Defaultuser/Kennwort hinterlegen.
Für AS/400-Verbindungen kann man per
ADDSVRAUTE USRPRF(*CURRENT) SERVER(RDBName) PASSWORD(MEINPASSW)
das Verbindungskennwort permanent hinterlegen.
-
Und wer behauptet denn sowas "ein Programm kann sich für einen SQL-Zugriff auch nur mit einer DB "gleichzeitig" verbinden."?
Natürlich kann man sich durchaus gleichzeitig mit mehreren DB's verbinden.
Dafür gibt es
a) "Connect to" zur Ziel-Datenbank
b) "Connect reset" zur lokalen Datenbank
usw....
Hallo Fuerchau,
das weiß ich doch selber...
GLEICHZEITIG !!!! ...also im Sinne meiner Anfrage !!!!
Zitat von Fuerchau
Per SQL ist ein direkter Zugriff auf 2 verschiedene Datenbanken leider nicht vorgesehen.
Es klappt weder ein "insert into ... select ... from " noch ein Join.
Du hast da leider nur die Möglichkeit, die Daten zwischen den DB's über eigene Tabellen zu synchronisieren.
Eine Prozedur oder auch Table-Function kann da zwar helfen, wird aber i.d.R. nicht performant sein, da ja die Where-Klausel u.U. nicht klappt.
Und wer behauptet denn sowas "ein Programm kann sich für einen SQL-Zugriff auch nur mit einer DB "gleichzeitig" verbinden."?
Natürlich kann man sich durchaus gleichzeitig mit mehreren DB's verbinden.
Dafür gibt es
a) "Connect to" zur Ziel-Datenbank
b) "Connect reset" zur lokalen Datenbank
Diese Befehle können beliebig oft wiederholt werden, wobei der Connect To nur beim 1. Aufruf tatsächlich eine neue Verbindung erstellt.
Geschlossen werden die Verbindungen erst am Ende.
Es gibt allerdings noch eine 2. Möglichkeit:
Ein Tabellenname ist eigentlich 3-teilig:
- DBName/Schema/Table
- DBname.Schema.Table
je nach Namenskonvention.
Da die Namenskonvention aber für das Gesamtprogramm gilt und andere DB's eher selten mit "/" zurechtkommen, bietet sich halt Naming=*SQL eher an.
Somit kann man mit:
select * from MyLib.MyTable
bzw.
select * from DestDB.Schema.Table
unter Umgehung des Connects aus beliebigen DB's innerhalb des Programmes lesen.
Per "CREATE ALIAS MYLIB/MYTABLE FOR DestDB.Schema.Table" kann man das noch anonymisieren.
Für das JVAGATE/ArdGate kann man in der Konfiguration einen Defaultuser/Kennwort hinterlegen.
Für AS/400-Verbindungen kann man per
ADDSVRAUTE USRPRF(*CURRENT) SERVER(RDBName) PASSWORD(MEINPASSW)
das Verbindungskennwort permanent hinterlegen.
-
... InfoSphere Federation Server kann sowas, kostet allerdings einiges und braucht einen zusätzlichen p-series Server und aufwändige Konfiguration und brummt nur, wenn die Daten auf eine Maschine repliziert werden. MS SQL linked Server kann sowas und holt die remote Tabelle dann adhoc rüber - mit entsprechend lausiger Performance.
Performant wird das ohnehin nur, wenn man entweder die remote Tabelle lokal repliziert oder die lokale remote. Von DB2/400 auf eine andere Büchse kann man durchaus per Trigger und ArdGate replizieren, ist aber ein wenig tricky.
Three part alias hilft hier wenig, da man damit nur eine remote Abfrage in eine lokale Tabelle ausgeben kann (im Prinzip nix anderes wie OUTPUT(*OUTFILE) bei QMQRY - uralter Wein in nichtmal neuen Schläuchen).
ADDSRVAUTE geht auch mit ArdGate connections.
D*B
Similar Threads
-
By lucullus in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 08-11-21, 10:58
-
By programmer400 in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 06-06-16, 20:45
-
By Malte in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 04-11-13, 15:46
-
By bds in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 04-09-02, 08:36
-
By Ursus in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 09-08-01, 07:59
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks