Acceso a la DB desde COBOL con código SQL embebido.

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'.