カテゴリ: COBOL 更新日: 2026/03/06

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 データベース連携 入門」など。

まとめ

まとめ
まとめ

今回の記事では、長年基幹システムを支え続けているCOBOL(コボル)言語における、データベース接続(DB連携)の基礎から実践的なサンプルプログラムまでを詳しく解説してきました。 プログラミング初心者の方にとって、「古い言語だからデータベース連携は難しいのではないか?」という先入観があるかもしれませんが、実際にはEmbedded SQL(埋め込みSQL)という非常に直感的で分かりやすい仕組みが用意されています。

COBOLでのデータベース操作の要点

記事を通じて学んだ通り、COBOLでデータベースを扱う際の核となるのは、プログラム内に直接SQLを記述する手法です。 以下のステップを確実に踏むことが、エラーの少ない堅牢なシステム構築の第一歩となります。

  • 環境の定義:SQLCA(SQL通信領域)をINCLUDEし、データベースの状態を常に監視できる状態にすること。
  • 変数の紐付け:ホスト変数(Host Variables)を正しく宣言し、コロン「:」を付けてSQL文に組み込むこと。
  • 接続の管理:CONNECTで始まり、処理が終われば必ずDISCONNECTでリソースを解放すること。
  • エラーハンドリング:SQLCODE(リターンコード)を確認し、正常終了(0)以外の場合の処理を記述すること。

実践的なC#との比較コード(サンプル)

現代の開発現場では、COBOLで構築された基幹データをC#などのモダンな言語から参照・更新するケースも増えています。 参考までに、先ほどのCOBOLの処理(会員データの更新)をC#のADO.NETで行う場合の書き方も見てみましょう。 言語が違っても「接続→実行→切断」というロジックの根底は同じであることが分かります。


using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    var sql = "UPDATE MEMBER_TABLE SET SALES_AMOUNT = @amount WHERE MEMBER_ID = @id";
    using (var command = new SqlCommand(sql, connection))
    {
        command.Parameters.AddWithValue("@amount", wsSalesAmount);
        command.Parameters.AddWithValue("@id", wsMemberId);
        
        int rowsAffected = command.ExecuteNonQuery();
        if (rowsAffected > 0)
        {
            Console.WriteLine("売上金額を更新しました。");
        }
    }
}

実行結果のイメージは以下の通りです。


売上金額を更新しました。
ID:100001 の新しい売上金額が表示されます。

これからの学習に向けて

「COBOL データベース接続」や「COBOL SQL 連携」といったキーワードで検索してこの記事に辿り着いた皆さんは、おそらく現場での修正業務や、レガシーシステムのマイグレーション(移行)に関わっている方も多いでしょう。 COBOLの文法は英語の文章に近く、可読性が非常に高いのが特徴です。 今回紹介したカーソル(CURSOR)の制御やFETCHのループ処理は、大量のバッチ処理を行う金融系や公共系のシステムでは必須の技術です。 ぜひ、手元の開発環境で実際にSQL文を書き換え、データの動きを体感してみてください。

先生と生徒の振り返り会話

生徒

先生、ありがとうございました!COBOLの中にSQLをそのまま書けるなんて驚きでした。 もっと複雑な書き方が必要なのかと思っていましたが、「EXEC SQL」と「END-EXEC」で囲むだけなら、SQLを知っていれば意外とスムーズに入れますね。

先生

その通りです。COBOLは「事務処理用」に特化した言語なので、データベースとの相性は抜群なんですよ。 特に、大量のデータを一行ずつ処理する「カーソル」の概念は、COBOLエンジニアにとっては基本中の基本です。

生徒

プログラムの中で使う変数に「:(コロン)」をつけるのを忘れそうですが、ここがCOBOL変数とSQLの列名を見分けるポイントなんですね。 あと、SQLCODEが「0」かどうかで成功を判断するというのも、シンプルで分かりやすいです。

先生

いいところに気づきましたね。ちなみに、データが見つからないときはSQLCODEが「100」になったり、エラーのときは負の値になったりします。 実際の現場では、こうした細かいコードの違いをチェックして、ログを出力する癖をつけるのがプロへの近道ですよ。

生徒

なるほど!「COBOL データベース 連携」の基本がしっかり理解できました。 次は、複数のテーブルを結合(JOIN)した複雑な抽出にも挑戦してみたいです。

先生

素晴らしい意欲ですね。結合処理も基本は同じです。 まずは今回のサンプルをベースに、自分なりにWHERE句の条件を変えたりして、データの変化を楽しんでみてください。 頑張りましょう!

カテゴリの一覧へ
新着記事
New1
COBOL
COBOLのファイル入出力のエラーと解決策まとめ!初心者向けやさしく解説
New2
COBOL
COBOLのジョブ実行ログ管理と監視方法を徹底解説!バッチ運用の基本
New3
C#
C#のnullとNullable型とは?初心者向けにnull許容型の基本と使い方を徹底解説!
New4
C#
C#のエラーと例外の基本!初心者がよく出会うエラーとその対処法まとめ
人気記事
No.1
Java&Spring記事人気No1
COBOL
COBOLのバッチ処理とは?基本構成と役割を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
COBOL
COBOLのコンパイラと開発環境を徹底解説!初心者にもわかりやすい入門ガイド
No.4
Java&Spring記事人気No4
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.7
Java&Spring記事人気No7
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法
No.8
Java&Spring記事人気No8
C#
C#のasyncとawaitの基本的な使い方をマスターしよう!非同期処理をやさしく解説