【入門編】DB2インジケータ変数によるNULL値の判定と処理 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iで挑むDB2の世界:NULL値の恐怖に「インジケータ変数」で立ち向かおう!

こんにちは!メインフレームの世界へようこそ。

これまでJavaやCOBOLでバリバリ開発してきた皆さんにとって、PL/I(ピーエル・ワン)という名前は、少し古風でとっつきにくい印象があるかもしれませんね。でも安心してください。PL/Iは「科学技術計算から事務処理まで何でもこなす」という野心的な設計思想で作られた、非常に柔軟で強力な言語です。

今日は、メインフレームの基幹システムで避けては通れない「DB2のNULL値処理」について、PL/I特有の作法を紐解いていきましょう。

1. なぜ「NULL」は特別扱いなのか?

Javaで言えば`null`、COBOLで言えば「NULLの概念をどう表現するか(フラグを立てる等)」という話になりますが、DB2の世界では、データが「空っぽ(NULL)」であるか「0や空白が入っている」かを厳密に区別します。

もし、NULLが入っているカラムをそのまま数値項目に読み込もうとすると……そう、SQLCODE -305(NULL値が割り当てられましたが、インジケータ変数がありません)という、初心者キラーなエラーがあなたを待っています。

2. インジケータ変数という「命綱」

このエラーを回避し、スマートにNULLを判定するために使うのが「インジケータ変数」です。これは、読み込むデータのすぐ後ろに配置する「番兵」のようなものだと考えてください。

PL/Iでの宣言方法

PL/Iでは、データ宣言が少し独特です。まずはコードを見てみましょう。

1
DCL WS_SALARY FIXED BIN(31); / 給与データを受け取る変数 /
DCL IND_SALARY FIXED BIN(15); / これがNULL判定用のインジケータ変数 /

/

  • ポイント:インジケータ変数は必ず FIXED BIN(15) で宣言します。
  • 理由は、DB2が戻り値として「-1」などの小さな整数しか返さないからです。

/

3. 実践!SQLでのハンドリング

では、実際にSQLを投げてデータを取得する際のコード例です。

1
/ — DB2データ取得の実践サンプル — /

EXEC SQL
SELECT SALARY
INTO :WS_SALARY :IND_SALARY
FROM EMPLOYEE
WHERE EMP_NO = ‘A001’;

/

  • SQL文の直後に「:変数名 :インジケータ名」と書くのがPL/Iの流儀です。
  • コロン(:)を忘れないようにしてくださいね!

/

IF SQLCODE = 0 THEN DO;
/ 正常終了時、インジケータ変数を確認 /
IF IND_SALARY = -1 THEN DO;
/ -1ならDB2からNULLが返ってきたと判断します /
PUT SKIP LIST(‘給与データはNULLです’);
WS_SALARY = 0; / プログラム内部で0に補正する等の処理 /
END;
ELSE DO;
/ NULLでなければそのまま計算に使えます /
PUT SKIP LIST(‘給与額は:’, WS_SALARY);
END;
END;
ELSE IF SQLCODE < 0 THEN DO; / ここでエラー処理(ROLLBACKやログ出力など)を行います / PUT SKIP LIST('致命的なエラー発生! SQLCODE:', SQLCODE); END; ---

4. 初学者がつまずきやすいポイント

PL/Iを初めて触る方がよく悩む「独特のルール」を補足しますね。

  • FIXED BIN(15) の呪文: なぜ(15)なのか? と思うかもしれませんが、これは「ハーフワード(2バイト)」を意味します。DB2との通信において、インジケータ変数は2バイトの整数でやり取りする決まりがあるため、ここは「おまじない」として覚えておくと便利ですよ。
  • コロン「:」の重要性: SQLの中でホスト変数(PL/Iの変数)を参照する際、必ずコロンをつけます。これを忘れるとコンパイラに「そんなSQLカラムは存在しない!」と怒られてしまいます。
  • SQLCODEの確認: SQLを実行した直後、必ず `SQLCODE` をチェックする癖をつけてください。0なら成功、正の値なら警告(NULL発生など)、負の値ならエラーです。

最後に:怖がらなくて大丈夫です

PL/Iのコードは、最初は宣言の多さに圧倒されるかもしれません。しかし、一つひとつの宣言が「メモリのこの場所を、こう扱う」と明示的に記述されているため、慣れてくると非常に読みやすく、デバッグもしやすい言語だと気づくはずです。

「NULLが来たらどうしよう?」という不安は、今回紹介したインジケータ変数という「番兵」がいればもう解決です。ぜひ、現場のコードで試してみてください。

もし分からないことがあれば、いつでもまた聞きに来てくださいね。あなたのメインフレーム開発ライフを心から応援しています!

タイトルとURLをコピーしました