¿Cuál es el resultado de la ejecución cuando se realizan cambios que no son SQL en el programa sin BIND?
Problema: Se cambia un programa COBOL-DB2 para aumentar la longitud de una variable de PIC X(5) a PIC X(8). Sin embargo, no hay cambios en el SQL del programa. ¿Cuál será el resultado si el plan/paquete del programa no está obligado a estos cambios?
Solución
El cambio de longitud variable de PIC X(5) a PIC X(8) no es un cambio de DB2 y no se requieren modificaciones para las sentencias SQL en el programa. Sin embargo, aún necesitamos VINCULAR su PLAN/PAQUETE, de lo contrario obtendremos el código de error SQL -818 que indica que “LA MARCA DE TIEMPO x GENERADA POR EL PRECOMPILER EN EL MÓDULO DE CARGA ES DIFERENTE DE LA MARCA DE TIEMPO DE ENLACE y CONSTRUIDA A PARTIR DEL DBRM z”.
El siguiente es el motivo de este error de SQL: en cada ejecución de un programa COBOL-DB2, se compara la marca de tiempo del módulo de carga y el paquete/DBRM. Si hay un cambio en la longitud de la variable (y no hay cambios de SQL) en el programa y se compila, entonces el módulo de carga tendrá la marca de tiempo recién generada y por otro lado si no se realiza el BIND, el El paquete/DBRM tendría una marca de tiempo antigua. Cuando se ejecuta este programa, el paso JCL que llama a este programa fallará con el código de error SQL -818.
Si tenemos un programa COBOL-DB2 cuya declaración SQL nunca cambiará en el futuro, podemos precompilar este programa con la opción NIVEL. A continuación se muestra el ejemplo del paso BIND usando la opción NIVEL.
Ejemplo
//BIND EXEC PGM=IKJEFT01
//STEPLIB DD DSN=DIS.TEST.LOADLIB,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(TB3)
BIND PLAN(PLANA) -
PKLIST(PACKA) -
LEVEL -
ACQUIRE(ALLOCATE) -
ISOLATION (RS)
/*