কম্পিউটার টিউটোরিয়াল

COBOL-DB2 প্রোগ্রামে BIND ছাড়া নন-SQL পরিবর্তনের ফলাফল

সমস্যা: একটি 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 স্টেটমেন্ট আসলেই অপরিবর্তিত থাকে।

  1. সি ভাষায় টোকেন (Tokens) কী?

  2. C ভাষায় লোকাল স্ট্যাটিক ভেরিয়েবল কী?

  3. C ভাষায় প্রি-প্রসেসর কমান্ডস (Pre-processor Commands) কী?

  4. সি প্রোগ্রামকে মেশিন কোডে কনভার্ট করার ৪ ধাপ