El código COBOL con SQL embebido requiere de un procedimiento de precompilado, compilado, y armado de archivo de declaraciones de la DB, estricto, para funcionar.
Trataré de explicar paso a paso todo el proceso.
Partimos de la base de datos creada en el punto anterior (dos campos, uno numérico y el otro texto).
NOTA: en este momento debemos crear el dataset de salida del MAGDLC (IBMUSER.MAG.COBOL).
IBMUSER.MAG.COPY
IBMUSER.MAG.DCLGEN
IBMUSER.MAG.IBMCOB
Todos (los 4 dataset) tendrán utilidad. Así que si aún no existen, a crearlos con el siguiente esquema.
Desde el menú principal del ispf, opción '3 Utilities' y ENTER. Opción '2 Data Set' y ENTER...
──────────────────────────────────────────────────────────────────────────────
Allocate New Data Set
Command ===>
Data Set Name . . . : IBMUSER.MAG.COBOL
Management class . . . (Blank for default management class)
Storage class . . . . (Blank for default storage class)
Volume serial . . . . ZARES1 (Blank for system default volume) **
Device type . . . . . (Generic unit or device address) **
Data class . . . . . . (Blank for default data class)
Space units . . . . . MEGABYTE (BLKS, TRKS, CYLS, KB, MB, BYTES
or RECORDS)
Average record unit (M, K, or U)
Primary quantity . . 20 (In above units)
Secondary quantity 10 (In above units)
Directory blocks . . 10 (Zero for sequential data set) *
Record format . . . . FB
Record length . . . . 80
Block size . . . . . 4000
Data set name type PDS (LIBRARY, HFS, PDS, LARGE, BASIC, *
EXTREQ, EXTPREF or blank)
Expiration date . . . (YY/MM/DD, YYYY/MM/DD
Enter "/" to select option YY.DDD, YYYY.DDD in Julian form
Allocate Multiple Volumes DDDD for retention period in days
or blank)
( * Specifying LIBRARY may override zero directory block)
( ** Only one of these fields may be specified) De la DB vamos a sacar el archivo de declaraciones (MAGDCL) con el DCLGEN.
Desde el menú principal del ispf, opción 'M More' y ENTER.
En del 'IBM Products Panel', opción '15 DB2 V9' y ENTER.
Dentro del 'DB2I PRIMARY OPTION MENU', opción '2 DCLGEN (Generate SQL and source language declarations)' y ENTER.
Llenamos los campos de la siguiente forma:
DCLGEN SSID: DB9G
===>
Enter table name for which declarations are required:
1 SOURCE TABLE NAME ===> MAGDEMO
2 TABLE OWNER ..... ===> IBMUSER
3 AT LOCATION ..... ===> (Optional)
Enter destination data set: (Can be sequential or partitioned)
4 DATA SET NAME ... ===> IBMUSER.MAG.COBOL(MAGDCL)
5 DATA SET PASSWORD ===> (If password protected)
Enter options as desired:
6 ACTION .......... ===> REPLACE (ADD new or REPLACE old declaration)
7 COLUMN LABEL .... ===> YES (Enter YES for column label)
8 STRUCTURE NAME .. ===> WS-REG-MAGTB (Optional)
9 FIELD NAME PREFIX ===> WS- (Optional)
10 DELIMIT DBCS .... ===> YES (Enter YES to delimit DBCS identifiers)
11 COLUMN SUFFIX ... ===> YES (Enter YES to append column name)
12 INDICATOR VARS .. ===> NO (Enter YES for indicator variables)
13 ADDITIONAL OPTIONS===> NO (Enter YES to change additional options)
PRESS: ENTER to process END to exit HELP for more information
Al apretar ENTER aparecerá:
DSNE904I EXECUTION COMPLETE, MEMBER MAGDCL REPLACED ***
Ya tenemos en IBMUSER.MAG.COBOL, MAGDCL que son las declaraciones de los campos usados en la DB.
Ahora podemos agregar en ese mismo dataset el miembro de fuente de COBOL. MAGSQL
El siguiente paso es precompilar MAGSQL para reconocer las instrucciones SQL que el compilador de COBOL no reconocerá.
Para esto desde el menú principal del ispf, opción 'M' y ENTER, opción '15 DB2 V9' y ENTER, y finalmente opción '4 PRECOMPILE' y ENTER.
En la pantalla que aparece, llenamos con los siguientes datos:
PRECOMPILE SSID: DB9G
COMMAND ===>
Enter precompiler data sets:
1 INPUT DATA SET .... ===> IBMUSER.MAG.IBMCOB(MAGSQL)
2 INCLUDE LIBRARY ... ===> IBMUSER.MAG.COPY(MAGDCL)
3 DSNAME QUALIFIER .. ===> TEMP (For building data set names)
4 DBRM DATA SET ..... ===> IBMUSER.MAG.IBMCOB(MAGDBRM)
Enter processing options as desired:
5 WHERE TO PRECOMPILE ===> FOREGROUND (FOREGROUND, BACKGROUND, or EDITJCL)
6 VERSION ........... ===>
(Blank, VERSION, or AUTO)
7 OTHER OPTIONS ..... ===>
PRESS: ENTER to process END to cancel HELP for more information
Se debe copiar el MAGSQL sin compilar a 1 INPUT DATA SET .... ===> IBMUSER.MAG.IBMCOB(MAGSQL) antes de ejecutar con ENTER el precompilado.
(O sea lo sacamos de IBMUSER.MAG.COBOL(MAGSQL) y lo copiamos a IBMUSER.MAG.IBMCOB(MAGSQL) con la opción '3.3')
Una vez que tenemos el precompilado MAGDBRM en IBMUSER.MAG.IBMCOB, lo copiaremos de vuelta a IBMUSER.MAG.COBOL.
NOTA: Aún no logro desde JCL evitar este paso de las copias. En cuanto lo tenga, modificare estas instrucciones.
Ya solo queda crear el JCL que reuna todo. Claro está que lo crearemos en IBMUSER.MAG.JCL con el nombre (MAGSQLC2).
El código del JCL es este MAGSQLCO
Solo queda ejecutarlo con 'SUB' y si todo va bien mostrará el registro ID=1 de nuestra base de datos.
LISTO!
NOTA: cada vez que ejecutamos el JCL se creará en IBMUSER.MAG.LOAD un miembro nuevo TEMPNAM0, TEMPNAM1, TEMPNAM2... etc.
El JCL solo ejecuta el TEMPNAM0, por lo que debemos borrar los existentes antes de cada 'SUB'.