COBOLのデータベース接続で使うホスト変数のデータ型と定義のコツを徹底解説!初心者でもわかる基本の考え方
生徒
「先生、COBOLでデータベースとやりとりする時に“ホスト変数”ってよく出てきますけど、どういうものなんですか?」
先生
「良いところに気づきましたね。ホスト変数というのは、COBOLのプログラム内でSQL文に値を渡したり、SQLの結果を受け取ったりするための変数のことなんです。」
生徒
「へえ〜、それって普通のCOBOLの変数と違うんですか?」
先生
「基本は同じなんですが、データベースとやり取りするために“データ型の定義”や“桁数”をしっかり合わせておく必要があります。今日は、そのホスト変数の定義方法と注意点を詳しく説明していきましょう。」
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. ホスト変数を定義する場所
ホスト変数は、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 SECTION と END DECLARE SECTION の間に定義された変数が、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. 定義のコツとよくある失敗例
ホスト変数を定義するときには、次のポイントを意識するとトラブルを防げます。
- ① 桁数を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. 実際の使用例
ここでは、社員情報をデータベースから取得する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. データ型選びの実践的アドバイス
現場では、データベースの設計書(テーブル定義書)を見ながら、COBOLのホスト変数を定義します。そのときに次のような考え方が役立ちます。
- ・文字列は余裕をもたせる:将来カラムが拡張されることを考えて、+2〜+5桁の余裕をもたせてもよい。
- ・数値は桁あふれを防ぐ:DBの桁数より小さい定義にすると、実行時にオーバーフロー(容量オーバー)が起きます。
- ・日付型は文字列で扱う:DATEやTIMESTAMPを扱うときは、
PIC X(10)やPIC X(26)で受け取るのが一般的です。
こうした細かい配慮が、COBOLのデータベースプログラムを安定して動かすために欠かせません。