在程式中進行非SQL更改時,如果未進行BIND,執行結果是什麼?
問題:一個 COBOL-DB2 程式修改了變數長度,從 PIC X(5) 增加到 PIC X(8)。但是,程式的 SQL 部分沒有變化。如果程式的計劃/包沒有針對這些更改進行繫結,結果會怎樣?
解決方案
變數長度從 PIC X(5) 更改為 PIC X(8) 不是 DB2 更改,程式中的 SQL 語句不需要修改。但是,我們仍然需要繫結其計劃/包,否則我們將得到 SQL 錯誤程式碼 -818,該程式碼表示“載入模組中的預編譯器生成的 TIMESTAMP x 與從 DBRM z 生成的繫結 TIMESTAMP 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) /*
廣告