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が来たらどうしよう?」という不安は、今回紹介したインジケータ変数という「番兵」がいればもう解決です。ぜひ、現場のコードで試してみてください。
もし分からないことがあれば、いつでもまた聞きに来てくださいね。あなたのメインフレーム開発ライフを心から応援しています!
