View Full Version : embeddet SQL, Lib variable setzen
Guten Tag,
Auf einer iSeries, die mehrere Testumgebungen und eine Produktiv Umgebung hat, müssen wir einen max wert aus einer Datei ermitteln.
/EXEC SQL
+ SET :SZAZ =(SELECT MAX(#XKEY#) FROM SAPASOP WHERE #INKEY# > 0)
/END-EXEC
Die Datei gibt es in der QTEMP und in der Echt/Test Umgebung
Qtemp steht in der Liblist vorne
Wie muß das Statement lauten, wenn ich die richtige lib z.b. in einer Variablen habe
/EXEC SQL
+ SET :SZAZ =(SELECT MAX(#XKEY#) FROM :MYLIB/SAPASOP WHERE #INKEY# > 0)
/END-EXEC
funktioniert nicht
Vielen Dank
Dietlinde Beck
Hallo Dietlinde,
mache vorher einfach einen OVRDBF
dcl-pr System int(10) extproc('system');
*n pointer value options(*string);
end-pr;
System( 'ovrdbf Datei ' + %Trim(MyLib) +'/SAPASOP' );
Exex SQL
SET :SZAZ =(SELECT MAX(#XKEY#) FROM DATEI WHERE #INKEY# > 0);
Gruß
Ronald
Das ist eine der schlechtesten Lösungen;-) da sie nicht SQL-Konform ist.
OVRDBF's sollte (und muss) man in SQL vermeiden, da eine Tabelle ja durchaus geöffnet bleibt und mit dieser weitergearbeitet wird auch wenn man den OVRDBF wieder löscht.
Das selbe gilt ebenso für CHGLIBL zur Laufzeit.
Der richtige Weg wäre ein dynamischer SQL per "Execute Statement".
Dschainers
09-11-18, 07:10
z.B.
d sqlstm s 1024a varying
d wrkfile s 20a inz('QTEMP/TESTFILE')
/Free
sqlstm = 'CREATE Table ' + %trim(wrkfile) +
' as +
(select * from test) +
with data ';
/End-Free
c/exec sql
c+ execute immediate :sqlstm
c/end-exec
c move *on *inlr
z.B.
d sqlstm s 1024a varying
d wrkfile s 20a inz('QTEMP/TESTFILE')
/Free
sqlstm = 'CREATE Table ' + %trim(wrkfile) +
' as +
(select * from test) +
with data ';
/End-Free
c/exec sql
c+ execute immediate :sqlstm
c/end-exec
c move *on *inlr
Und wo landet das Ergebnis?
Welches Ergebnis?
Dieses Ergebnis ist eine neue Tabelle!
Ich weiß auch nicht, was dies mit deiner Frage zu tun hat.
Deine Anfrage geht nur mit einem dynamischen Cursor (ohne Exec SQL):
D MyOpen S 1000 varying
MyOpen = 'Select blabla ....';
prepare statement from : MyOpen;
declare OpenCursor cursor for MyOpen;
open OpenCursor;
fetch OpenCursor into : MyVar;
close OpenCursor;
Dschainers
09-11-18, 08:47
Ich wollte nur aufzeigen, wie man ein variables SQL Statement zusammenbaut.
Da dies anscheinend noch nicht bekannt war.
Welches Ergebnis?
Dieses Ergebnis ist eine neue Tabelle!
Ich weiß auch nicht, was dies mit deiner Frage zu tun hat.
Deine Anfrage geht nur mit einem dynamischen Cursor (ohne Exec SQL):
D MyOpen S 1000 varying
MyOpen = 'Select blabla ....';
prepare statement from : MyOpen;
declare OpenCursor cursor for MyOpen;
open OpenCursor;
fetch OpenCursor into : MyVar;
close OpenCursor;
statement Name im declare und prepare müssen matchen, also:
exec sql declare OpenCursor cursor for MyOpen;
exec sql prepare MyOpen from : MyOpen;
D*B,
dem sich bei Datenbank und LIBL der Magen rumdreht. Besser wäre, Namimg *SQL und die Umgebung über das default Schema zu steuern.
z.B.
d sqlstm s 1024a varying
d wrkfile s 20a inz('QTEMP/TESTFILE')
/Free
sqlstm = 'CREATE Table ' + %trim(wrkfile) +
' as +
(select * from test) +
with data ';
/End-Free
c/exec sql
c+ execute immediate :sqlstm
c/end-exec
c move *on *inlr
genau das hatte ich bei mir mit dem SET gestestet. Und es hat bei mir nicht funktioniert. Deshalb bin ich auf dem OVRDBF gekommen
Was soll den ein "Create Table" für eine Set-Anweisung zurückliefern?
Das wäre mir aber neu;-).