COBOLのデータベース接続:総合サンプルプログラムで初心者でもわかる連携方法
生徒
「先生、COBOLでデータベースと連携するプログラムって、初心者でも書けますか?」
先生
「はい、できます。今日はデータベース接続(データベースれんけい)について、実際に使えるサンプルプログラムを交えて、初心者でも理解できるように解説します。」
生徒
「プログラミング初心者でも分かるように、丁寧に教えてください!」
先生
「もちろんです。それでは、どんな準備が必要かから話し始めましょう。」
1. データベース連携とは?/キーワード整理
まずは「データベース連携(データベースれんけい)」という言葉を整理しましょう。これは、プログラム(この場合は COBOL)が「データベース(でーたべーす)」という大量のデータを保存・管理する場所と、『読み書き』を行う仕組みのことです。
言い換えれば、図書館の本棚が「データベース」で、プログラムが「図書館司書」のように本(データ)を探して取り出したり、戻したりするイメージです。キーワードとしては「COBOL データベース接続」「COBOL-データベース連携」「Embedded SQL COBOL」「ホスト変数 COBOL」「カーソル COBOL」などがあります。
特に初心者向けとしては、次の用語を押さえておきましょう:
- Embedded SQL(インベデッドSQL):プログラムの中に直接SQL文(データベースを操作する命令)を埋め込む方式です。:contentReference[oaicite:1]{index=1}
- ホスト変数(Host Variables):COBOLプログラム側でデータベースから値を読み込んだり、値を渡したりするために使う変数です。:contentReference[oaicite:2]{index=2}
- カーソル(Cursor):データベースの複数行データを順に読み込むための仕組みです。:contentReference[oaicite:3]{index=3}
- SQLCA(SQL Communication Area):SQL 文の結果やステータスをプログラムに返すための領域です。例えば「うまくいきましたか」「エラーですか」といった情報が入ります。:contentReference[oaicite:4]{index=4}
2. 総合サンプルプログラムの構成を理解しよう
ここでは、COBOLでデータベースに「接続して」「データを取得して」「更新して」「閉じる」一連の流れを含む“総合プログラム例”をご紹介します。実際にサンプルコードを見て「どこで何をしているか」を丁寧に読み解んでいきます。
このサンプルでは、以下の手順を含みます:
- データベース接続(CONNECT)
- データ取得(SELECT/FETCHを使った読み込み)
- データ更新(UPDATE/INSERTなど)
- カーソルを使った複数レコード処理
- データベース切断(DISCONNECT)
初心者でもイメージしやすいように、テーブル名やフィールド名もシンプルにしています。「会員テーブル」「売上テーブル」など、現実の「箱(テーブル)」として考えてください。
3. サンプルプログラム(COBOL+Embedded SQL)
以下が「会員データを取得して、売上データを更新する」簡易的なサンプルです。プログラミング未経験でも“流れ”をつかめるようになっています。
IDENTIFICATION DIVISION.
PROGRAM-ID. MEMBER-SALES-UPDATE.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE MEMBER_TABLE
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-MEMBER-ID PIC 9(6).
01 WS-MEMBER-NAME PIC X(30).
01 WS-SALES-AMOUNT PIC 9(8)V99.
01 WS-COUNT PIC 9(4).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
*> 接続
EXEC SQL
CONNECT TO SALESDB USER :DBUSER USING :DBPASS
END-EXEC.
*> 会員を探します(例:会員ID=100001)
MOVE 100001 TO WS-MEMBER-ID.
EXEC SQL
SELECT MEMBER_NAME, SALES_AMOUNT
INTO :WS-MEMBER-NAME, :WS-SALES-AMOUNT
FROM MEMBER_TABLE
WHERE MEMBER_ID = :WS-MEMBER-ID
END-EXEC.
IF SQLCODE = 0 THEN
DISPLAY "会員:" WS-MEMBER-NAME " 現在売上:" WS-SALES-AMOUNT
ELSE
DISPLAY "会員データ取得に失敗しました。SQLCODE=" SQLCODE
END-IF.
*> 売上金額を更新します:+5000
ADD 5000 TO WS-SALES-AMOUNT.
EXEC SQL
UPDATE MEMBER_TABLE
SET SALES_AMOUNT = :WS-SALES-AMOUNT
WHERE MEMBER_ID = :WS-MEMBER-ID
END-EXEC.
IF SQLCODE = 0 THEN
DISPLAY "売上金額を更新しました。新しい金額:" WS-SALES-AMOUNT
ELSE
DISPLAY "売上更新に失敗しました。SQLCODE=" SQLCODE
END-IF.
*> 複数レコード処理(例えば売上0以上の会員を列挙する)
EXEC SQL
DECLARE CUR1 CURSOR FOR
SELECT MEMBER_ID, MEMBER_NAME, SALES_AMOUNT
FROM MEMBER_TABLE
WHERE SALES_AMOUNT >= 0
END-EXEC.
EXEC SQL
OPEN CUR1
END-EXEC.
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH CUR1 INTO :WS-MEMBER-ID, :WS-MEMBER-NAME, :WS-SALES-AMOUNT
END-EXEC.
IF SQLCODE = 0 THEN
DISPLAY "ID:" WS-MEMBER-ID " 名前:" WS-MEMBER-NAME " 売上:" WS-SALES-AMOUNT
END-IF
END-PERFORM.
EXEC SQL
CLOSE CUR1
END-EXEC.
*> 切断
EXEC SQL
DISCONNECT SALESDB
END-EXEC.
STOP RUN.
このプログラムでは、まず接続し、単一レコードを取得・更新し、その後カーソルを使って複数レコードを繰り返し読み込んで表示、最後に切断しています。
「SELECT INTO :変数」「UPDATE … SET …」「DECLARE CURSOR」「OPEN/FETCH/CLOSE」といった構文が出てきましたが、これは「埋め込みSQL(Embedded SQL)」として、COBOLの中にSQL文を直接書く方法です。:contentReference[oaicite:5]{index=5}
4. コードの各部分を丁寧に解説(初心者向け)
では上のサンプルコードの中で、「なぜこのように書いてあるのか」「何をしているのか」をひとつひとつ見てみましょう。
- CONNECT TO SALESDB USER :DBUSER USING :DBPASS
→ これは「このデータベース(SALESDB)に接続します。ユーザー名 :DBUSER と パスワード :DBPASS を使います」という命令です。図書館でいう「図書館に入る(利用者登録して入館)」ようなイメージです。 - SELECT … INTO :WS-MEMBER-NAME, :WS-SALES-AMOUNT … WHERE MEMBER_ID = :WS-MEMBER-ID
→ 「会員テーブルから会員ID=100001の名前と売上金額を取り出して、変数(ワーキングストレージ領域)に入れてね」という命令です。SQLの基本操作で、「WHERE句(条件)」を使って必要なデータだけを取りにいきます。 - UPDATE MEMBER_TABLE SET SALES_AMOUNT = :WS-SALES-AMOUNT WHERE MEMBER_ID = :WS-MEMBER-ID
→ 「取り出した売上金額に5000を足して、その新しい金額を会員テーブルに書き戻します」という更新操作です。「書き込み(更新)」という意味ですね。 - DECLARE CURSOR …
→ 「カーソル(CUR1)という名前の“複数レコードを順番に読むための道具”を宣言します」という準備です。以降、OPEN→FETCH(取り出す)→CLOSEという流れで使います。 - PERFORM UNTIL SQLCODE NOT = 0
→ これは「SQLCODE(エスキューエルコード)が0=成功でなくなるまで繰り返す」というループ(繰り返し)処理です。SQLCODEについては先ほどの説明通り、実行結果のステータスコードです。:contentReference[oaicite:6]{index=6} - DISCONNECT SALESDB
→ 最後にデータベースから切断します。図書館でいうところの「本棚を出て帰る」ような動作です。
このように「接続 → 単一取得 → 更新 → 複数取得 → 切断」という流れが、COBOLでデータベース連携を行う基本の“型(フロー)”となります。初心者の方でもこの流れを押さえておくことで、自分なりにアレンジしやすくなります。
5. 初心者が注意すべきポイントとキーワード整理
データベースと連携するプログラムを書くときに、初心者がつまずきやすい点や、知っておきたいキーワードを整理します。
- ホスト変数の宣言漏れ:SELECT・UPDATEなどで使う変数を WORKING-STORAGE に正しく宣言していないとエラーになります。
- SQL文の書き間違い:特に WHERE 条件、変数のプレフィックス「:(コロン)」を忘れないようにしましょう。ホスト変数を使う時は必ず「:変数名」です。:contentReference[oaicite:7]{index=7}
- カーソルの閉じ忘れ:CURSOR を OPEN だけして CLOSE を忘れると、リソースが無駄になります。必ず CLOSE を記述しましょう。
- SQLCODE の確認:SQL の実行結果をチェックして、「うまくいったか」を確認することが重要です。エラー発生時に処理を止めたりログを出したり出来るようにします。
- 接続と切断のバランス:CONNECT してから処理をして、最後に切断(DISCONNECT)する。この順序が逆だと動きません。
また、検索エンジンで見つかりやすくするためのキーワードも整理します:
「COBOL データベース接続 サンプル」「COBOL Embedded SQL 初心者」「COBOL カーソル 複数レコード」「COBOL SQLCODE チェック」「COBOL データベース連携 入門」など。