在没有 BIND 的情况下,如果在程序中进行非 SQL 更改,执行结果会怎样?
mysqlmysqli database
问题: COBOL-DB2 程序被更改为将变量的长度从 PIC X(5) 增加到 PIC X(8)。但是,程序的 SQL 没有任何变化。如果程序的计划/包未绑定这些更改,结果会怎样?
解决方案
变量长度从 PIC X(5) 更改为 PIC X(8) 不是 DB2 更改,并且程序中的 SQL 语句无需修改。但是,我们仍然需要绑定其计划/包,否则我们将收到 SQL 错误代码 -818,该代码指出"加载模块中的预编译器生成的时间戳 x 与从 DBRM z 构建的绑定时间戳 y 不同"。
以下是此 SQL 错误的原因 - 在每次执行 COBOL-DB2 程序时,都会比较加载模块和包/DBRM 的时间戳。如果程序中的变量长度发生变化(并且没有 SQL 更改)并且进行了编译,则加载模块将具有新生成的时间戳,另一方面,如果没有执行绑定,则包/DBRM 将具有旧的时间戳。执行此程序时,调用此程序的 JCL 步骤将失败,并出现 SQL 错误代码 -818。
如果我们有一个 COBOL-DB2 程序,其 SQL 语句将来永远不会改变,我们可以使用选项 LEVEL 预编译此程序。以下是使用 LEVEL 选项的 BIND 步骤的示例。
示例
//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) /*