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

COBOLのデータベース接続で使うホスト変数のデータ型と定義のコツを徹底解説!初心者でもわかる基本の考え方

ホスト変数のデータ型と定義のコツ
ホスト変数のデータ型と定義のコツ

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

生徒

「先生、COBOLでデータベースとやりとりする時に“ホスト変数”ってよく出てきますけど、どういうものなんですか?」

先生

「良いところに気づきましたね。ホスト変数というのは、COBOLのプログラム内でSQL文に値を渡したり、SQLの結果を受け取ったりするための変数のことなんです。」

生徒

「へえ〜、それって普通のCOBOLの変数と違うんですか?」

先生

「基本は同じなんですが、データベースとやり取りするために“データ型の定義”や“桁数”をしっかり合わせておく必要があります。今日は、そのホスト変数の定義方法と注意点を詳しく説明していきましょう。」

1. ホスト変数とは?

1. ホスト変数とは?
1. ホスト変数とは?

COBOLでデータベース(DB)と通信するとき、SQL文を直接書くだけでは、プログラム内のデータをやり取りできません。そこで使われるのがホスト変数(Host Variable)です。ホスト変数は、COBOLの中で宣言された変数を、SQL文の中で使えるようにする“橋渡し”のような役割を持ちます。

たとえば、社員番号を指定して社員名を取得するSQLをCOBOLで書くとき、次のようにホスト変数を利用します。


EXEC SQL
    SELECT EMP-NAME
    INTO :WS-NAME
    FROM EMPLOYEE
    WHERE EMP-ID = :WS-ID
END-EXEC

この例では、:WS-ID:WS-NAMEがホスト変数です。COBOLのプログラム内に定義しておき、SQL文と連携して値をやり取りします。

2. ホスト変数を定義する場所

2. ホスト変数を定義する場所
2. ホスト変数を定義する場所

ホスト変数は、COBOLプログラムのWORKING-STORAGE SECTION(ワーキング・ストレージ部)に定義します。ここは、プログラム内で使うデータを宣言する場所です。

たとえば、次のようにホスト変数を定義します。


WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01  WS-ID        PIC 9(4).
01  WS-NAME      PIC X(20).
01  WS-AGE       PIC 9(3).
EXEC SQL END DECLARE SECTION END-EXEC.

EXEC SQL BEGIN DECLARE SECTIONEND DECLARE SECTION の間に定義された変数が、SQL文で使えるホスト変数になります。この部分を宣言しておかないと、コンパイルエラーになることがあります。

3. ホスト変数のデータ型とSQLの対応

3. ホスト変数のデータ型とSQLの対応
3. ホスト変数のデータ型とSQLの対応

データベース側のカラム(列)には、「文字型」や「数値型」などの種類があります。ホスト変数は、そのカラムの型に合わせたデータ型で定義する必要があります。これを間違えると、データが正しく取得できなかったり、実行時にエラーが出たりします。

代表的な対応関係を以下にまとめます。

データベースの型(SQL側) COBOL側の型(ホスト変数) 説明
CHAR / VARCHAR PIC X(n) 文字列型。名前や住所などを扱う。
INTEGER / SMALLINT PIC 9(n) 整数型。社員番号や年齢など。
DECIMAL / NUMERIC PIC 9(n)V9(m) 小数点付き数値。金額や給与など。
DATE / TIME / TIMESTAMP PIC X(n) 文字列として受け取るのが一般的。

特に数値型では、小数点の位置(V)を合わせることが重要です。データベースの桁数に合わせて、COBOLの変数定義も調整しましょう。

4. 定義のコツとよくある失敗例

4. 定義のコツとよくある失敗例
4. 定義のコツとよくある失敗例

ホスト変数を定義するときには、次のポイントを意識するとトラブルを防げます。

  • ① 桁数をDBと同じにする
    たとえば、データベースのカラムがVARCHAR(30)なら、COBOL側もPIC X(30)にします。短すぎるとデータが切り捨てられることがあります。
  • ② 数値と文字を混同しない
    社員番号を‘0010’のように文字で扱いたい場合はPIC X(4)に。数値として計算するならPIC 9(4)にします。
  • ③ NULL値を考慮する
    データベースには「値が入っていない(NULL)」という状態があります。COBOLでは、INDICATOR 変数を使ってNULLを扱います。

たとえば、次のように定義してNULLを検知できます。


01  WS-NAME        PIC X(20).
01  WS-NAME-IND    PIC S9(4) COMP.

EXEC SQL
    SELECT EMP-NAME INTO :WS-NAME :WS-NAME-IND
    FROM EMPLOYEE
    WHERE EMP-ID = :WS-ID
END-EXEC

WS-NAME-INDの値が負のときは、データベースでNULLが返されたという意味になります。

5. 実際の使用例

5. 実際の使用例
5. 実際の使用例

ここでは、社員情報をデータベースから取得するCOBOLプログラムの簡単な例を紹介します。


WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01  WS-ID        PIC 9(4) VALUE 1001.
01  WS-NAME      PIC X(20).
01  WS-AGE       PIC 9(3).
EXEC SQL END DECLARE SECTION END-EXEC.

PROCEDURE DIVISION.
EXEC SQL
    SELECT EMP-NAME, EMP-AGE
    INTO :WS-NAME, :WS-AGE
    FROM EMPLOYEE
    WHERE EMP-ID = :WS-ID
END-EXEC.
DISPLAY "社員名:" WS-NAME.
DISPLAY "年齢:" WS-AGE.
STOP RUN.

    実行結果:
    社員名:タナカ タロウ
    年齢:35

このように、ホスト変数を正しく定義すれば、COBOLから安全にデータベースの値を取得できます。特に桁数やデータ型を丁寧に合わせることが、エラーを防ぐ最大のコツです。

6. データ型選びの実践的アドバイス

6. データ型選びの実践的アドバイス
6. データ型選びの実践的アドバイス

現場では、データベースの設計書(テーブル定義書)を見ながら、COBOLのホスト変数を定義します。そのときに次のような考え方が役立ちます。

  • ・文字列は余裕をもたせる:将来カラムが拡張されることを考えて、+2〜+5桁の余裕をもたせてもよい。
  • ・数値は桁あふれを防ぐ:DBの桁数より小さい定義にすると、実行時にオーバーフロー(容量オーバー)が起きます。
  • ・日付型は文字列で扱う:DATEやTIMESTAMPを扱うときは、PIC X(10)PIC X(26)で受け取るのが一般的です。

こうした細かい配慮が、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演算子の違いと使い方