Computer >> Máy Tính >  >> Lập trình >> MySQL

Kết quả thực thi khi các thay đổi không phải SQL được thực hiện trong chương trình mà không có BIND là gì?

Vấn đề: Một chương trình COBOL-DB2 được thay đổi để tăng độ dài của một biến từ PIC X (5) thành PIC X (8). Tuy nhiên, không có thay đổi nào trong SQL của chương trình. Kết quả sẽ ra sao nếu gói / gói chương trình không bị ràng buộc cho những thay đổi này?

Giải pháp

Sự thay đổi độ dài có thể thay đổi từ PIC X (5) sang PIC X (8) không phải là một thay đổi của DB2 và không có sửa đổi nào cần thiết cho các câu lệnh SQL trong chương trình. Tuy nhiên, chúng ta vẫn cần RẮN KẾ HOẠCH / GÓI của nó, nếu không, chúng ta sẽ nhận được mã lỗi SQL -818 cho biết rằng “TIMESTAMP ĐƯỢC PHÁT SINH TRƯỚC x TRONG MÔ ĐUN TẢI KHÁC VỚI KẾ HOẠCH BIND TIMESTAMP y TÍCH HỢP TỪ DBRM z”.

Sau đây là lý do cho lỗi SQL này - Trong mỗi lần thực thi chương trình COBOL-DB2, dấu thời gian của mô-đun tải và gói / DBRM được so sánh. Nếu có sự thay đổi về độ dài của biến (và không có thay đổi SQL nào) trong chương trình và nó được biên dịch, thì mô-đun tải sẽ có dấu thời gian mới được tạo và mặt khác nếu BIND không được thực hiện, gói / DBRM sẽ có một dấu thời gian cũ. Khi chương trình này được thực thi, bước JCL gọi chương trình này sẽ không thành công với mã lỗi SQL -818.

Nếu chúng ta có một chương trình COBOL-DB2 mà câu lệnh SQL sẽ không bao giờ thay đổi trong tương lai, chúng ta có thể biên dịch trước chương trình này với tùy chọn LEVEL. Dưới đây là mẫu của bước BIND sử dụng tùy chọn LEVEL.

Ví dụ

//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)
/*