Cobol-database-interface
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