সমস্যা: একটি COBOL-DB2 প্রোগ্রামে ভেরিয়েবলের দৈর্ঘ্য PIC X(5) থেকে PIC X(8) এ বাড়ানো হয়েছে। কিন্তু SQL স্টেটমেন্টে কোনো পরিবর্তন নেই। প্রোগ্রামের প্ল্যান/প্যাকেজ রি-বাইন্ড না করলে কী হবে?
সমাধান
ভেরিয়েবল দৈর্ঘ্য পরিবর্তন DB2-র পরিবর্তন নয়, SQL-এও পরিবর্তন নেই। তবুও প্ল্যান/প্যাকেজ বাইন্ড করতে হবে। অন্যথায় রানটাইমে SQL কোড -818 ত্রুটি হবে।
কারণ
- প্রতিবার COBOL-DB2 প্রোগ্রাম এক্সিকিউট হওয়ার সময়, লোড মডিউলের টাইমস্ট্যাম্প এবং প্যাকেজ/DBRM-এর টাইমস্ট্যাম্প তুলনা হয়।
- প্রোগ্রাম রিকম্পাইল করলে (ভেরিয়েবল দৈর্ঘ্য পরিবর্তনের জন্য) লোড মডিউলে নতুন টাইমস্ট্যাম্প আসে।
- প্যাকেজ/DBRM বাইন্ড না করলে পুরনো টাইমস্ট্যাম্প থাকে।
- মিল না মিলে SQLCODE -818: "THE PRECOMPILER-GENERATED TIMESTAMP x IN THE LOAD MODULE IS DIFFERENT FROM THE BIND TIMESTAMP y BUILT FROM THE DBRM z"।
বিকল্প: LEVEL অপশন দিয়ে বাইন্ড
যদি ভবিষ্যতে SQL কখনো পরিবর্তন না হয়, তবে প্রি-কম্পাইল সময় LEVEL অপশন ব্যবহার করে বাইন্ড করা যায়।
//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)
/*
ব্যাখ্যা: LEVEL অপশন বোঝায় টাইমস্ট্যাম্প মিলিয়ে না, বরং কনসিস্টেন্সি টোকেন (consistency token) মিলিয়ে। এটি শুধু তখনই কাজ করে যখন SQL স্টেটমেন্ট আসলেই অপরিবর্তিত থাকে।