カテゴリ: COBOL 更新日: 2025/11/18

COBOLのホスト変数と変換ルールを完全ガイド!初心者でもわかるデータベース連携の仕組み

データベースのホスト変数と変換ルール
データベースのホスト変数と変換ルール

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

生徒

「先生、COBOLからデータベースにアクセスするとき、データを受け取るための変数ってどうすればいいんですか?」

先生

「いい質問ですね。COBOLでデータベースを扱うときには、ホスト変数という特別な変数を使います。これを使うことで、SQLとCOBOLのデータをやり取りできるようになります。」

生徒

「ホスト変数って、普通のCOBOLの変数と違うんですか?」

先生

「少し違います。ホスト変数は、データベースのデータ型とCOBOLのデータ型をつなぐための“橋渡し役”なんです。今日はその使い方と変換の仕組みを詳しく学びましょう。」

1. ホスト変数とは?

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

COBOLでデータベースを操作するときには、SQLの中にCOBOLの変数を使うことができます。そのときに使うのがホスト変数(Host Variable)です。

ホスト変数は、COBOLの中で宣言した変数を、SQL文の中で使えるようにするための特別な記法です。SQL文の中でCOBOLの変数を使うときは、変数名の前にコロン(:)をつけます。


EXEC SQL
    SELECT EMPLOYEE_NAME
    INTO :EMP-NAME
    FROM EMPLOYEE
    WHERE EMPLOYEE_ID = :EMP-ID
END-EXEC.

この例では、:EMP-NAME:EMP-IDがホスト変数です。SQLの世界とCOBOLの世界をつなぐ「窓口」のような役割を持っています。

2. ホスト変数の宣言場所

2. ホスト変数の宣言場所
2. ホスト変数の宣言場所

ホスト変数は、COBOLのWORKING-STORAGE SECTIONまたはLINKAGE SECTIONで宣言します。データベースから取り出した値を格納するために使われます。


WORKING-STORAGE SECTION.
01  EMP-ID        PIC 9(4).
01  EMP-NAME      PIC X(30).

このように宣言しておくと、SQL文の中で:EMP-ID:EMP-NAMEとして使えるようになります。

ここでのPIC(ピクチャ)とは、COBOLの変数の形式を表す命令です。たとえばPIC 9(4)は「4桁の数字」、PIC X(30)は「30文字の文字列」を意味します。

3. データ型の変換ルールを理解しよう

3. データ型の変換ルールを理解しよう
3. データ型の変換ルールを理解しよう

ホスト変数を使うときに重要なのが、データベースとCOBOLのデータ型の違いです。データベースとCOBOLはそれぞれ独自の型を持っているため、互いに変換(マッピング)が必要になります。

データベースの型 COBOLのホスト変数型 説明
CHAR(n) PIC X(n) 固定長の文字列を扱います。スペースで埋められます。
VARCHAR(n) PIC X(n) 可変長文字列ですが、COBOL側では固定長として扱います。
INTEGER PIC S9(9) COMP 符号付き整数。COMPは内部的に2進数で格納されます。
DECIMAL(10,2) PIC S9(8)V99 COMP-3 10桁中2桁が小数。COMP-3はパック形式で格納します。
DATE PIC X(10) 「YYYY-MM-DD」形式の文字列として扱うことが多いです。

このように、SQLのデータ型とCOBOLのデータ型の間には対応関係(マッピング)があります。型が一致していないと、データの取得や更新が正しく行えないことがあります。

4. 数値型と文字型の変換の注意点

4. 数値型と文字型の変換の注意点
4. 数値型と文字型の変換の注意点

特に注意が必要なのが「文字列と数値の変換」です。データベースでは「12345」という数値も文字として扱えることがありますが、COBOLでは厳密に型を区別します。

たとえば、次のようなケースを考えてみましょう。


EXEC SQL
    SELECT SALARY
    INTO :EMP-SAL
    FROM EMPLOYEE
    WHERE EMPLOYEE_ID = :EMP-ID
END-EXEC.

ここで、データベースのSALARY列が数値型である場合、COBOL側のEMP-SALも数値型(PIC S9(7)V99 COMP-3など)にしなければなりません。文字型(PIC X(10))にしてしまうと、文字として受け取ってしまい、数値計算ができなくなります。

5. NULL値の扱いとINDICATOR変数

5. NULL値の扱いとINDICATOR変数
5. NULL値の扱いとINDICATOR変数

データベースでは、「値が存在しない」ことを表すNULLという特別な値があります。COBOLではNULLを直接扱えないため、INDICATOR変数を使ってNULLの有無を判定します。


EXEC SQL
    SELECT EMPLOYEE_NAME
    INTO :EMP-NAME :EMP-NAME-IND
    FROM EMPLOYEE
    WHERE EMPLOYEE_ID = :EMP-ID
END-EXEC.

ここで:EMP-NAME-INDがインジケータ変数です。これは通常S9(4) COMP型で定義します。SQL実行後、もしデータがNULLだった場合、この変数には「-1」が設定されます。


IF EMP-NAME-IND = -1
    DISPLAY "データが存在しません。"
END-IF

これで、NULLデータを安全に扱うことができます。

6. 実際のプログラム例で確認しよう

6. 実際のプログラム例で確認しよう
6. 実際のプログラム例で確認しよう

最後に、ホスト変数と変換ルールを使った簡単なCOBOLプログラムを見てみましょう。


WORKING-STORAGE SECTION.
01  EMP-ID        PIC 9(4) VALUE 1001.
01  EMP-NAME      PIC X(30).
01  EMP-NAME-IND  S9(4) COMP.

PROCEDURE DIVISION.
    EXEC SQL
        SELECT EMPLOYEE_NAME
        INTO :EMP-NAME :EMP-NAME-IND
        FROM EMPLOYEE
        WHERE EMPLOYEE_ID = :EMP-ID
    END-EXEC.

    IF EMP-NAME-IND = -1
        DISPLAY "該当する社員が見つかりません。"
    ELSE
        DISPLAY "社員名は:" EMP-NAME
    END-IF.

社員名は:山田太郎

このように、ホスト変数を正しく使うことで、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演算子の違いと使い方