View Full Version : exec sql drop variable
Globale SQL-Variablen funktionieren ähnlich wie Datenbereiche in der QTEMP auch wenn die Variable als permanentes Objekt in einer beliebigen Bibliothek gespeichert ist. Der Wert der Variablen wird innerhalb des Jobs vor Aufruf/Ausführung der View gesetzt, einfach mit dem SQL Statement SET. Die globale Variable selber wird in der View-Definition angegeben (wie andere Spalten, Special Registers oder konstante Werte). Die globale Variable muss allerdings vor Erstellung der View generiert sein.
In mehreren Jobs kann die gleiche (globale) Variable unterschieldiche Werte haben.
Beispiel: Stücklisten-Auflösung. In Job1 wird die Artikel-Nr. 4711 analysiert, während im zweiten Job die Artikel-Nr. 5713 verwendet wird.
Job1:
Set ArtikelNr = '4711';
Select * from View;
Job2:
Set ArtikelNr = 5713';
Select * From View
Birgitta
Globale SQL-Variablen funktionieren ähnlich wie Datenbereiche in der QTEMP auch wenn die Variable als permanentes Objekt in einer beliebigen Bibliothek gespeichert ist. Der Wert der Variablen wird innerhalb des Jobs vor Aufruf/Ausführung der View gesetzt, einfach mit dem SQL Statement SET. Die globale Variable selber wird in der View-Definition angegeben (wie andere Spalten, Special Registers oder konstante Werte). Die globale Variable muss allerdings vor Erstellung der View generiert sein.
In mehreren Jobs kann die gleiche (globale) Variable unterschieldiche Werte haben.
Beispiel: Stücklisten-Auflösung. In Job1 wird die Artikel-Nr. 4711 analysiert, während im zweiten Job die Artikel-Nr. 5713 verwendet wird.
Job1:
Set ArtikelNr = '4711';
Select * from View;
Job2:
Set ArtikelNr = 5713';
Select * From View
Birgitta
... das ist doch wieder so ein "just to fool the russians" Feature nach dem Motto: Zaubertuch in den Hut, Kaninchen raus. (Was passiert da eigentlich, wenn man noch kein Set gemacht hat, geht es dann ab in den Wald?) Und ich sehe die View immer noch nicht, für die man sowas braucht - und zur Parametrisierung gibt es ja auch noch UDTFs, bei denen man einen klaren Zusammenhang zwischen reingehenden Werten und rauskommenden Daten sieht. Naja, Spielzeug, für Leute, die zuviel Zeit haben (denen ich weiterhin viel Spass wünsche)...
D*B
Was passiert da eigentlich, wenn man noch kein Set gemacht hat, geht es dann ab in den Wald?
Man kann natürlich einen Default-Wert bei der Variablen-Definition vorgeben.
Birgitta
Da entzieht sich mir auch der Sinn einer globalen Variable, wenn sie denn doch jobspezifisch ist und somit eine lokale Varibale ist.
Da entzieht sich mir auch der Sinn einer globalen Variable, wenn sie denn doch jobspezifisch ist und somit eine lokale Varibale ist.
... die ist Connection spezifisch, sprich ACTGRP level und dass man eine lokale Variable global nennt und den Typ global festlegt, aber lokal verwendet, erhöht den Verwirrungsfaktor, das hat richtig Potential - und ich sehe einige Gesichter vor mir, die das ausloten werden (nach dem Motto: ich habe hier eine Lösung und suche das passende Problem), oder bereits tun...
D*B
War es vielleicht besser, dass man das Ding LOCAL Data Area (*LDA) genannt hat, jedoch den Inhalt GLOBAL (programmunabhängig) für den ganzen Job verwendet hat??????
In diesem Fall finde ich GLOBAL für den ganzen Job im Gegensatz zu LOKAL (programm-intern) fast logischer!
... vielleicht solltet Ihr Euch bei der IBM oder auch bei denjenigen, die den SQL Standard definieren beschweren. Die haben nämlich diese Namensgebung verbrochen!
Birgitta
War es vielleicht besser, dass man das Ding LOCAL Data Area (*LDA) genannt hat, jedoch den Inhalt GLOBAL (programmunabhängig) für den ganzen Job verwendet hat??????
In diesem Fall finde ich GLOBAL für den ganzen Job im Gegensatz zu LOKAL (programm-intern) fast logischer!
... vielleicht solltet Ihr Euch bei der IBM oder auch bei denjenigen, die den SQL Standard definieren beschweren. Die haben nämlich diese Namensgebung verbrochen!
Birgitta
... das ist doch mal ein treffender Vergleich LDA mit create variable, das hat beides Potential für Murks!
Ob ich mich da über den SQL Standard beschweren muss? ich meine eher nicht, das ist m. E. keiner. Gefunden habe ich das nur bei SQL Anywhere und die definieren das Ding auch auf Connection Level und schmeißen das anschließend weg - und das scheint ja bei der 400 anders zu sein.
Meine Empfehlung ist klar und eindeutig: Finger weg von unnötigen Gimmicks - und ich habe sowas noch nicht vermisst und sehe auch momentan kein Beispiel, wo das einen realen Vorteil hat. Guter Programmierstil zeichnet sich oft dadurch aus nur das zu benutzen, was man braucht und nicht dadurch so viel wie möglich von dem zu verwenden, was es da so alles gibt.
D*B
andreaspr@aon.at
17-01-13, 09:10
Guter Programmierstil zeichnet sich oft dadurch aus nur das zu benutzen, was man braucht und nicht dadurch so viel wie möglich von dem zu verwenden, was es da so alles gibt.
Das gleiche habe ich auch schon von SQL gehört ;)
Das Phänomen, dass man neuem eher Kritisch gegenüber steht ist ja nichts neues.
Vielleicht sagen die Menschen in 10 Jahren: Wieso hat man(n) damals so kompliziert gearbeitet, wenn es doch einfachere Ansätze gibt. (u.a. auch Sequenzen)
Allerdings muss ich zugeben, dass ich bis jetzt auch noch keinen Einsatz für die globale Variable finden konnte.
Detto mit LDAs. Wobei ich lieber die SQL Variable verwenden würde als eine LDA.
Eventuell für Webanwendungen wo für eine Verarbeitung die Session-ID mehrere Programme/Prozeduren benötigen.
Die könnte dann in der globalen Variable gespeichert werden.
Vielleicht findet sich ja noch ein konkretes Beispiel wo es durchaus Sinn macht!
lg Andreas
das Ursprüngliche Problem war:
http://newsolutions.de/forum-systemi-as400-i5-iseries/newsboard-programmierung/17282-create-table-lib-file.html
Dank Birgitta konnte ich es lösen.
Da hier im Forum immer mal wieder Probleme gelöst werden, die wir noch nie hatten ...
finde ich die Diskusion recht amüsant.
Aber ich bin sicher Dieter hat recht.
1. nicht alles was geht muß man auch machen.
2. es gibt immer eine andere Lösung.
Wenn der drop Variable mit erzählen würde, warum er nicht geht, gäbe die Diskusion nicht.
Robi
Wenn der drop Variable mit erzählen würde, warum er nicht geht, gäbe die Diskusion nicht.
Robi
Habt Ihr's mal damit versucht im Programm den SQLCODE zu prüfen und anschließend mit GET DIAGNOSTICS euch den Fehler-Text zu holen ;) ?
Oder einen STRDBG (ohne alle Parameter) vor der Programm-Ausführung abzusetzen und das Joblog danach zu prüfen?
Birgitta