当程序中进行非SQL更改而不进行BIND时的执行结果是什么?

当程序中进行非SQL更改而不进行BIND时的执行结果是什么?

问题: 将 COBOL-DB2 程序中变量从 PIC X(5) 改为 PIC X(8),但程序中的 SQL 没有更改。如果未对该程序的计划/包进行 BIND,则会发生什么结果?

阅读更多:MySQL 教程

解决方案

将变量长度从 PIC X(5) 改为 PIC X(8) 不是 DB2 更改,并且程序中的 SQL 语句不需要进行修改。但是,我们仍然需要对其 PLAN/PACKAGE 进行 BIND,否则我们将获得 SQL 错误码 -818,指出“加载模块中的预编译生成的时间戳 x 与从 DBRM z 生成的 BIND 时间戳 y 不同”。

以下是此 SQL 错误的原因-在执行 COBOL-DB2 程序的每次执行中,会比较加载模块和程序包/DBRM 的时间戳。如果程序中变量的长度发生更改(且没有 SQL 更改),并且已进行编译,则加载模块将具有新生成的时间戳,另一方面,如果未执行 BIND,则程序包/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)
/*

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程