カテゴリ: COBOL 更新日: 2025/12/05

COBOLのデータベース接続:総合サンプルプログラムで初心者でもわかる連携方法

データベース連携の総合サンプルプログラム例
データベース連携の総合サンプルプログラム例

先生と生徒の会話形式で理解しよう

生徒

「先生、COBOLでデータベースと連携するプログラムって、初心者でも書けますか?」

先生

「はい、できます。今日はデータベース接続(データベースれんけい)について、実際に使えるサンプルプログラムを交えて、初心者でも理解できるように解説します。」

生徒

「プログラミング初心者でも分かるように、丁寧に教えてください!」

先生

「もちろんです。それでは、どんな準備が必要かから話し始めましょう。」

1. データベース連携とは?/キーワード整理

1. データベース連携とは?/キーワード整理
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. 総合サンプルプログラムの構成を理解しよう

2. 総合サンプルプログラムの構成を理解しよう
2. 総合サンプルプログラムの構成を理解しよう

ここでは、COBOLでデータベースに「接続して」「データを取得して」「更新して」「閉じる」一連の流れを含む“総合プログラム例”をご紹介します。実際にサンプルコードを見て「どこで何をしているか」を丁寧に読み解んでいきます。

このサンプルでは、以下の手順を含みます:

  1. データベース接続(CONNECT)
  2. データ取得(SELECT/FETCHを使った読み込み)
  3. データ更新(UPDATE/INSERTなど)
  4. カーソルを使った複数レコード処理
  5. データベース切断(DISCONNECT)

初心者でもイメージしやすいように、テーブル名やフィールド名もシンプルにしています。「会員テーブル」「売上テーブル」など、現実の「箱(テーブル)」として考えてください。

3. サンプルプログラム(COBOL+Embedded SQL)

3. サンプルプログラム(COBOL+Embedded SQL)
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. コードの各部分を丁寧に解説(初心者向け)

4. コードの各部分を丁寧に解説(初心者向け)
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. 初心者が注意すべきポイントとキーワード整理

5. 初心者が注意すべきポイントとキーワード整理
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 データベース連携 入門」など。

カテゴリの一覧へ
新着記事
New1
C#
C#のメモリ管理とガーベジコレクションの基礎を理解しよう
New2
C#
C#の参照型と値型の違いを初心者向けにやさしく解説!
New3
C#
C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター
New4
C#
C#の戻り値にタプルを使う方法!複数の値を返すテクニック
人気記事
No.1
Java&Spring記事人気No1
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.2
Java&Spring記事人気No2
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.3
Java&Spring記事人気No3
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.4
Java&Spring記事人気No4
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.8
Java&Spring記事人気No8
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方