Cobol-database-interface

提供:Dev Guides
移動先:案内検索

COBOL-データベースインターフェイス

今のところ、COBOLでのファイルの使用を学びました。 次に、COBOLプログラムがDB2と対話する方法について説明します。 次の用語が含まれます-

  • 埋め込みSQL
  • DB2アプリケーションプログラミング
  • ホスト変数
  • SQLCA
  • SQLクエリ
  • カーソル

埋め込みSQL

埋め込みSQLステートメントは、COBOLプログラムで標準のSQL操作を実行するために使用されます。 埋め込みSQLステートメントは、アプリケーションプログラムがコンパイルされる前に、SQLプロセッサによって前処理されます。 COBOLは*ホスト言語*として知られています。 COBOL-DB2アプリケーションは、COBOLとDB2の両方を含むアプリケーションです。

埋め込みSQLステートメントは、若干の変更を加えた通常のSQLステートメントと同様に機能します。 たとえば、クエリの出力は、 Host Variables と呼ばれる定義済みの変数セットに送られます。 追加のINTO句がSELECTステートメントに配置されます。

DB2アプリケーションプログラミング

以下は、COBOL-DB2プログラムのコーディング中に従うべき規則です-

  • すべてのSQLステートメントは、 EXEC SQL と* ENDEXEC。*で区切る必要があります。
  • SQLステートメントは、エリアBでコーディングする必要があります。
  • プログラムで使用されるすべてのテーブルは、WorkingStorageセクションで宣言する必要があります。 これは、 INCLUDE ステートメントを使用して行われます。 *INCLUDEおよびDECLARE TABLE以外のすべてのSQLステートメントは、手続き部に表示する必要があります。

ホスト変数

ホスト変数は、テーブルからデータを受信したり、テーブルにデータを挿入したりするために使用されます。 ホスト変数は、プログラムとDB2の間で受け渡されるすべての値に対して宣言する必要があります。 これらは、Working-Storage Sectionで宣言されています。

ホスト変数をグループ項目にすることはできませんが、ホスト構造内でグループ化できます。* 名前変更*または*再定義*することはできません。 SQLステートメントでホスト変数を使用し、*コロン(:)。*をプレフィックスとして付けます。

構文

以下は、ホスト変数を宣言し、Working-Storageセクションにテーブルを含めるための構文です-

DATA DIVISION.
   WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE table-name
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.

   01 STUDENT-REC.
      05 STUDENT-ID PIC 9(4).
      05 STUDENT-NAME PIC X(25).
      05 STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

SQLCA

SQLCAは、DB2がSQL実行のフィードバックをプログラムに渡すSQL通信領域です。 実行が成功したかどうかをプログラムに伝えます。 エラーコードを含む SQLCODE のようなSQLCAの下には多くの定義済み変数があります。 SQLCODEの値 '000’は、実行が成功したことを示します。

構文

以下は、Working-StorageセクションでSQLCAを宣言する構文です-

DATA DIVISION.
WORKING-STORAGE SECTION.
    EXEC SQL
    INCLUDE SQLCA
    END-EXEC.

SQLクエリ

Student-Id、Student-Name、Student-Addressを含む 'Student’という名前のテーブルが1つあるとします。

STUDENTテーブルには、次のデータが含まれています-

Student Id      Student Name        Student Address
1001               Mohtashim M.     Hyderabad
1002               Nishant Malik        Delhi
1003               Amitabh Bachan       Mumbai
1004               Chulbul Pandey       Lucknow

次の例は、COBOLプログラムでの SELECT クエリの使用方法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   EXEC SQL
      INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
      INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   EXEC SQL
      SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS
      INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT
      WHERE STUDENT-ID=1004
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY WS-STUDENT-RECORD
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

1004 Chulbul Pandey     Lucknow

次の例は、COBOLプログラムでの INSERT クエリの使用方法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.
   MOVE 'finddevguides' TO WS-STUDENT-NAME.
   MOVE 'Hyderabad' TO WS-STUDENT-ADDRESS.

   EXEC SQL
      INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS)
      VALUES (:WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS)
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY 'Record Inserted Successfully'
      DISPLAY WS-STUDENT-REC
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Record Inserted Successfully
1005 finddevguides      Hyderabad

次の例は、COBOLプログラムでの UPDATE クエリの使用方法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 'Bangalore' TO WS-STUDENT-ADDRESS.
   EXEC SQL
      UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
      WHERE STUDENT-ID = 1003
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY 'Record Updated Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Record Updated Successfully

次の*例*は、COBOLプログラムでの DELETE クエリの使用法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.

   EXEC SQL
      DELETE FROM STUDENT
      WHERE STUDENT-ID=:WS-STUDENT-ID
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY 'Record Deleted Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Record Deleted Successfully

カーソル

カーソルは、一度に複数の行選択を処理するために使用されます。 これらは、クエリのすべての結果を保持するデータ構造です。 これらは、Working-Storage SectionまたはProcedure Divisionで定義できます。 カーソルに関連付けられている操作は次のとおりです-

  • 宣言する
  • Open
  • 閉じる
  • フェッチ

カーソルを宣言

カーソル宣言は、Working-Storage SectionまたはProcedure Divisionで実行できます。 最初のステートメントは、実行不可能なステートメントであるDECLAREステートメントです。

EXEC SQL
   DECLARE STUDCUR CURSOR FOR
   SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
   WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

Open

カーソルを使用する前に、Openステートメントを実行する必要があります。 Openステートメントは、実行のためにSELECTを準備します。

EXEC SQL
   OPEN STUDCUR
END-EXEC.

閉じる

Closeステートメントは、カーソルが占有しているすべてのメモリを解放します。 プログラムを終了する前にカーソルを閉じることは必須です。

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

フェッチ

Fetchステートメントはカーソルを識別し、値をINTO句に入れます。 Fetchステートメントは、一度に1行を取得するときにループでコーディングされます。

EXEC SQL
   FETCH STUDCUR
   INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.

次の例は、STUDENTテーブルからすべてのレコードをフェッチするカーソルの使用法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

   EXEC SQL
      DECLARE STUDCUR CURSOR FOR
      SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
      WHERE STUDENT-ID >:WS-STUDENT-ID
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1001 TO WS-STUDENT-ID.
   PERFORM UNTIL SQLCODE = 100

   EXEC SQL
      FETCH STUDCUR
      INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
   END-EXEC

   DISPLAY WS-STUDENT-REC
END-PERFORM
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM=IKJEFT01
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

1001 Mohtashim M.       Hyderabad
1002 Nishant Malik      Delhi
1003 Amitabh Bachan     Mumbai
1004 Chulbul Pandey     Lucknow