COBOLのホスト変数と変換ルールを完全ガイド!初心者でもわかるデータベース連携の仕組み
生徒
「先生、COBOLからデータベースにアクセスするとき、データを受け取るための変数ってどうすればいいんですか?」
先生
「いい質問ですね。COBOLでデータベースを扱うときには、ホスト変数という特別な変数を使います。これを使うことで、SQLとCOBOLのデータをやり取りできるようになります。」
生徒
「ホスト変数って、普通のCOBOLの変数と違うんですか?」
先生
「少し違います。ホスト変数は、データベースのデータ型とCOBOLのデータ型をつなぐための“橋渡し役”なんです。今日はその使い方と変換の仕組みを詳しく学びましょう。」
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. ホスト変数の宣言場所
ホスト変数は、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. データ型の変換ルールを理解しよう
ホスト変数を使うときに重要なのが、データベースと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. 数値型と文字型の変換の注意点
特に注意が必要なのが「文字列と数値の変換」です。データベースでは「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変数
データベースでは、「値が存在しない」ことを表す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. 実際のプログラム例で確認しよう
最後に、ホスト変数と変換ルールを使った簡単な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プログラムからデータベースの情報を安全にやり取りできるようになります。