Anmelden

View Full Version : embeddet SQL, Lib variable setzen



Seiten : [1] 2 3 4

dibe
08-11-18, 11:19
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

malzusrex
08-11-18, 12:27
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

Fuerchau
08-11-18, 16:30
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

dibe
09-11-18, 07:57
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?

Fuerchau
09-11-18, 08:22
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.

BenderD
09-11-18, 09:10
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.

malzusrex
09-11-18, 11:39
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

Fuerchau
09-11-18, 11:54
Was soll den ein "Create Table" für eine Set-Anweisung zurückliefern?
Das wäre mir aber neu;-).