PDA

View Full Version : SQLRPGLE



malzusrex
29-10-13, 11:59
Habe da mal eine weitere Frage.
Bei folgenden Code bekomme ich beim 1. Aufruf ein Ergebnis.
Beim 2. Aufruf habe ich keine Werte mehr.
Im JOBLOG steht
Verbindung zum SYSTEM_B besteht bereits
MYFILE in MYLIB nicht gefunden




c/exec sql
c+ set option commit = *none
c/end-exec
c/exec sql
c+ Connect To SYSTEM_B
c/end-exec
c/exec sql
c+ Select Feld1, Feld2, Feld3 into :Sum1, Sum2, Sum3
c+ from MyLib/MyFile
c+ where Feld4 = :wert4
c/end-exec
c/exec sql
c+ Connect To SYSTEM_A
c/end-exec


Ich vermute mal, das ich da irgendwas falsch mache, beim HIN- und HER- schalten zwischen den beiden Systemen A und B.
Was muss ich ändern, damit es geht ?

Gruß
Ronald

Fuerchau
29-10-13, 12:55
Leider kann RPG nur 1 Verbindung zu einer Zeit verarbeiten.
Beim Start ist man automatisch mit LOCAL verbunden.
Beim Connect wird zum Zielsystem verbunden.
Mittels "Connect Reset" verbindet man sich wieder lokal, so dass ein neuer Connect zu einem anderen System wieder möglich ist.

Aber Achtung:
Macht man das sehr häufig in einem Programm führt das unweigerlich zu Performance-Einbußen!

Successful connection:
If the CONNECT statement is successful:

v
All open cursors are closed, all prepared statements are destroyed, and all locks

are released from the current connection.

v
The activation group is disconnected from all current and dormant connections,

if any, and connected to the identified application server.


Ich habe mir damal mit 2 Programmen und jeweils eigenen ACTGRP's beholfen.
Jede ACTGRP führt nur einen Connect durch und hält diese Verbindung bis zum Ende.
Funktionsaufrufe zwischen den beiden gehen sehr schnell.

Fuerchau
29-10-13, 13:01
Ergänzung:
Man kann also nicht innerhalb eines Programmes per Select Daten aus Maschine A lesen und dann in Maschine B oder Local schreiben.

Ergänzung 2:
Wenn dein Programm keine eigene ACTGRP hat, zerstört der Connect natürlich die Verbindung für übergeordnete Programme.
Erfolgt also von einem SQL-Programm ein CALL auf dein Programm, zerstörst du offene Cursor des übergeordneten Programmes.
Verlässt du nun ohne CONNECT RESET (oder auch beim Absturz) diese Ebene, gilt diese Verbindung nun für alle nachfolgenden SQL's, die keinen expliziten Connect lokal durchführen.
Ganz vertrakt wird es dann bei Verwendung von SQL-Serviceprogrammen mit ACTGRP(*CALLER).
Diese arbeiten dann natürlich auch mit deiner aktuellen Verbindung wenn du keinen Reset machst.

BenderD
29-10-13, 14:46
Das Zauberwort heißt SET CONNECTION...
- lokal bist du im SQLRPGLE automatisch verbunden
- mit connect to system_b verbindest Du Dich remote und diese Verbindung ist automatisch aktiv
- jetzt geht der select auf die remote
- mit set connection <Name der *local> wechselst Du die aktive Verbindung
- jetzt geht ein select oder wasAuchImmer auf die lokale DB
- mit Performance und Cursor schließen und ACTGRP hat das alles nix zu tun
- da werden auch keine Cursor zugemacht, oder ähnliches
- in einem SQL Statement kaannst Du immer nur eine DB ansprechen

D*B

PS: der zentrierte Text sieht ja wirklich besch... aus