dynamisches SQL in Cobol
- Dieses Thema hat 26 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 16 Jahre, 8 Monaten vonMitglied.
- AuthorPosts
- 22. Februar 2006 um 14:35 Uhr #2668
Hi all,
wer kann mir sagen, wie ich die Beispielprogamme zum dynamischen SQL ( Hauptprog und Unterprog) aus Application Programming zum Laufen bekomme ?
Wenn ich das Hpro ohne DB2 wandle und dann das Upro mit DB2 aufgerufen wird, fehlt das DB2 in der JCL (-927 glaub ich war es).
Wandle ich beides als DB2-Programme, bekomme ich ein leeres DBRM und der Bind Package knallt.Wie muss ich also wandeln, und welche optionen muss ich beim bind Plan/package angeben ?
greets Perix
23. Februar 2006 um 7:12 Uhr #3077Hi Perix,
wenn’s der -927 war dann sollte es ausreichen das Programm unter dem Command-Processor (und damit unter TSO) laufen zu lassen. Sieht dann etwa fürs Programm DSNTEP2 so aus:
//DSNTEP2 EXEC PGM=IKJEFT01,DYNAMNBR=20
//STEPLIB DD DISP=SHR,DSN=DB2E.SDSNLOAD
//SYSPRINT DD SYSOUT=X
//SYSTSPRT DD SYSOUT=X
//SYSTSIN DD *
DSN SYSTEM (DSNE)
RUN PROGRAM (DSNTEP2) PLAN (DSNTEP2) PARMS (‚/ALIGN(LHS)‘)
//SYSIN DD *
SET CURRENT SQLID = ‚…‘;Für Anwendungsprogramm muss die Steplib noch um die entsprechende Loadlib erweitert werden.
MfG Rolf
23. Februar 2006 um 7:48 Uhr #3368Hallo Rolf and all,
ich hab das Ding gestern noch zum Laufen bekommen und zwar wie folgt.
HPRO = Hauptprogramm
UPRO = UnterprogrammHPRO- Precompile,
Compile,
Link,
Bind mit Parametern :
DSN SYSTEM(DBXY)
BIND PLAN(BVHPRO) OWNER(myowner) –
PKLIST(Plist.*) –
VALIDATE(BIND) ISOLATION(CS) CACHESIZE(256) –
ACQUIRE(ALLOCATE) RELEASE(DEALLOCATE) –
ACTION(REPLACE) RETAIN –
DYNAMICRULES(BIND)
ENDund kein bind Package
Upro
Precompile
Compile
Link
Bind mit Parametern
DSN SYSTEM(DBXY)
BIND PLAN(BVUPRO) OWNER(myowner) –
PKLIST(Plist.*) –
VALIDATE(BIND) ISOLATION(CS) CACHESIZE(256) –
ACQUIRE(ALLOCATE) RELEASE(DEALLOCATE) –
ACTION(REPLACE) RETAIN
END
Bind Package mit Parametern
DSN SYSTEM(DBXY)
BIND PACKAGE(Package) OWNER(myowner) MEMBER(BVUPRO) –
ACTION(REPLACE) VALIDATE(BIND) EXPLAIN(YES)
ENDUnd start des Upro über das Hpro mit IKJEFT01 und SYSTSIN DD *
DSN SYSTEM(DBXY)
RUN PROGRAM(HPRO) –
PLAN(HPRO) –
LIB(‚mylib‘)
END
/*So läuft es….
Hat einer dazu noch Anmerkungen, Komentare oder Verbesserungsvorschläge ??Gruß
Perix
23. Februar 2006 um 8:12 Uhr #3549Möchte mal behaupten, das sich der -927 nicht durch Dynamicrules (Bind) verschwunden ist (nur falls du die Ursache dafür suchst).
MfG Rolf
15. März 2006 um 8:32 Uhr #3676So,
der SELECT funzt.
Jetzt klemmt der "einfache" EXECUTE mit Update o.ä.
Hat mal jemand mit "Parameter Markern" und Describe über die SQLDA gearbeitet ?
Theoretisch liest sich das ganz einfach, nur bei der Umsetzung in Cobol ergeben sich bei mir da ein paar Fragen.
Gibt es da Erfahrung bei Euch ?
Greets Perix
15. März 2006 um 10:03 Uhr #3768Hi,
wo klemmts denn genau? Hab das schon mal gemacht, allerdings in PL/I.
MfG rolf
15. März 2006 um 11:01 Uhr #3826Wie ich das sehe weiss ich im schlimmsten Fall ja weder die Anzahl, noch die Art der Parameter Marker.
Also kann ich vorher auch nicht die entsprechenden Hostvariablen definieren, weder die Größe (ein oder 300 Byte), noch die Art (pic x( ) oder doch eher pic comp ).und schließlich muß ich dann ja an den Adressen der Hostvariablen auch noch zur Ausführungszeit die richtigen Werte in einer adäquaten Form zur Verfügung stellen.
:-/ hmmmm :schwitz:15. März 2006 um 11:45 Uhr #3864Für den schlimmsten Fall hast du recht, da wirds auch gerade in COBOL schwierig.
Die kritische Stelle ist wenn du den SQL-String zusammenbastelst. Immer wenn du ein Parameter-Marker (?) reinhängst, kannst du i. A. auch die SQLDA füllen (gilt für Input-Parameter).
Ansonsten wirds etwas kompliziert. Letztendlich bist du selbst für den Speicherbereich verantwortlich, den du DB2 zur Verfügung stellst. Wie der in COBOL belegt wird ist DB2 egal. In PL/I gibts für sowas die Speicherklasse Controlled, aber ich kenne keine Entsprechung in COBOL.
Es gibt div. Möglichkeiten für dyn. SQL, insbesonsdere mit fixer oder variabler Select-Clause und Input- bzw. Output-Parameter-Marker.
Im Application Programming and SQL-Guide sind die Möglichkeiten beschrieben (allerdings extrem komprimiert). Schau dir mal die Kapitel– Coding dynamic SQL in application programs (S. 535, bzw. ab S. 545)
– Sample COBOL dynamic SQL program (S. 931) (Adresszuweisungen und dyn. Speicherverwaltung)an (die Seitenangaben beziehen sich auf V8-Doku).
Vielleicht kannst du mal kurz skizzieren, was du vorhast. Aber eins vorweg: Die eierlegende Wollmilchsau ist am schwierigsten!
MfG Rolf
15. März 2006 um 11:56 Uhr #3893Hallo Rolf,
das Handbuch Application Programming and SQL Guide habe ich schon durchgeackert.
Das Cobol-Beispiel für den Select ist i.A. brauchbar. (Wenn auch nicht 1:1, da ein paar Fehler drin sind).
Nur eben bei dem Beispiel zum parameter marker über die SQLDA erschöpft sich die Literatur auf einen schlecht kommentierten PL/1 Auszug.
Und wenn schon dynamisch dann auch gleich richtig, also Eierlegende…..sau
Gruß
Perix
16. März 2006 um 8:30 Uhr #3915Hi Perix,
aber man muss sich das Leben ja nicht unnötig schwer machen. Was soll das Programm denn machen?
MfG Rolf
16. März 2006 um 9:32 Uhr #3926Hi Rolf,
in der Luxus-Version sollte eben Alles mit Allem bearbeitet werden könen.
Diesen Weg verfolge ich aber zur Zeit nur noch soooo.. hm.. akademisch… sagt man glaub ichFür den Praxiseinsatz kommt aber eher die einfachere Variante mit fixer Anzahl von Hostvars in Frage. Dazu hab ich keine Fragen
Greets
Perix16. März 2006 um 9:50 Uhr #3936Sry, ich versteh’s irgendwie nicht. Demnach willst du SQLs der Form
UPDATE table
SET col1 = ?, col2 = ?,….
WHERE cola = ? and colb = ? and….verarbeiten, du weisst aber nicht welche HVs verwendet werden?
MfG Rolf
16. März 2006 um 12:41 Uhr #3945Hallo Perix,
in einem Artikel von Craig Mullins wird die Arbeit mit Dynamic SQL und Cobol (Execute Immediate, SELECT Fixed List, SELECT Varying List) sehr schön beschrieben. Das sollte Dir ein Stückchen weiterhelfen.
Using Dynamic SQL for Maximum Flexibility
By Craig S. Mullins
http://www.craigsmullins.com/dbu_1004.htmGruß
Gernot16. März 2006 um 12:53 Uhr #3951RolfD wrote: Sry, ich versteh’s irgendwie nicht. Demnach willst du SQLs der Form
UPDATE table
SET col1 = ?, col2 = ?,….
WHERE col1 = ? and col2 = ? and….verarbeiten, du weisst aber nicht welche HVs verwendet werden?
MfG Rolf
Bei der Luxusvariante sind alle roten Teile unbekannt.
Bei der [glb]praktikablen Variante [/glb] (wollte hier nur mal glow ausprobieren)
werde ich den dynamischen Teil auf die WHERE Bedingung eingrenzen und somit auch kein Problem mit der Ausprägung (char? dec? o.ä.) der HostVars haben16. März 2006 um 13:18 Uhr #3956Nachtrag zum Append von vorhin:
😀
es gibt noch ein tolles Redbook von der IBM: Squeezing the Most Out of Dynamic SQL with DB2 for z/OS and OS/390.http://www.redbooks.ibm.com/redbooks/pdfs/sg246418.pdf
An diesem Redbook hat unser geschätzer Kollege und Forum-Mitglied Axel Pürner mitgeschrieben. Hätte er Zeit, würde er sich an diesem Thread bestimmt beteiligen. :-/
Ciao
Gernot - AuthorPosts
You must be logged in to reply to this topic.