【入門編】VERIFY関数による入力データの妥当性検証 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの世界へようこそ!PL/Iで「入力チェック」をスマートに行う方法

こんにちは。長年、IBMメインフレームの深淵でシステムアーキテクチャと格闘してきた、あるアーキテクトです。

「PL/I? なんだか古臭い呪文のようだな」と感じている方もいるかもしれませんね。JavaやC#を使いこなす現代のエンジニアから見ると、確かにその構文は少し独特で、最初は戸惑うかもしれません。でも、安心してください。PL/Iは非常に強力で、一度仲良くなればこれほど頼もしい相棒はいません。

今日は、そんなPL/Iの入り口として、「入力データの妥当性検証」という現場で避けては通れないテーマを、`VERIFY`関数を使って紐解いていきましょう。

1. PL/Iの基本構造:まずは骨組みを知る

PL/Iのプログラムは、大まかに「家」を建てるようなイメージで構成されます。

  • PACKAGE: 家の敷地(名前空間を管理する境界)
  • PROCEDURE: 家の中の各部屋(処理の単位)
  • OPTIONS(MAIN): この家(プログラム)の玄関(ここから実行が始まります)

1
MY_PROGRAM: PACKAGE;

/ メイン処理の入り口 /
VAL_CHECK: PROCEDURE OPTIONS(MAIN);

/ ここにロジックを記述します /

END VAL_CHECK;

END MY_PROGRAM;

COBOLで言うところの `PROGRAM-ID` や `PROCEDURE DIVISION` が、もっと自由で洗練された形になったものだと想像してください。

2. VERIFY関数:そのデータ、本当に「数値」ですか?

現場でよくあるトラブルの一つが、「数値項目にゴミデータが混入している」というケースです。例えば、ユーザーが入力した金額フィールドに、アルファベットや特殊記号が紛れ込んでいたら、計算処理で即座に「アベンド(異常終了)」してしまいます。

そこで登場するのが `VERIFY`関数 です。

VERIFY関数の心意気

`VERIFY(string, reference)` は、「string(調べたい文字列)」の中に、「reference(許容する文字セット)」に含まれない文字が最初に現れる位置を教えてくれる関数です。

  • もし結果が「0」なら: stringは全てreferenceの文字で構成されている(OK!)
  • もし結果が「0以外」なら: referenceに含まれない不正な文字がその位置にある(NG!)

実務での活用パターン:数値チェック

例えば「純粋な数字(0〜9)」だけを許可したい場合、以下のように書きます。

1
/ 入力データが数値のみで構成されているかチェック /
DCL INPUT_DATA CHAR(10) INIT(‘12345A7890’); / 不正な文字’A’が含まれている /
DCL VALID_CHARS CHAR(10) INIT(‘0123456789’);
DCL POS FIXED BIN(15);

/ VERIFYの結果、’A’の位置である「6」が返る /
POS = VERIFY(INPUT_DATA, VALID_CHARS);

IF POS ^= 0 THEN
PUT SKIP EDIT(‘エラー: ‘, POS, ‘番目に不正文字を発見しました’)(A, F(2), A);
ELSE
PUT SKIP EDIT(‘データは正常です’)(A);

3. なぜPL/Iでやるのか?(メインフレームの現場の知恵)

なぜ `IF` 文で一文字ずつループを回さず、`VERIFY` を使うのか。それは「メインフレームの設計思想」にあります。

PL/Iの組み込み関数は、ハードウェアレベルで最適化されていることが多いのです。何万件、何百万件というレコードをバッチ処理で高速にさばく必要があるメインフレームの世界では、「いかにCPUサイクルを節約するか」が至上命題。`VERIFY`のような関数は、コンパイラが最も効率的な機械語へと翻訳してくれるため、手書きのループよりも圧倒的に高速で、かつ可読性が高いのです。

4. 初学者のためのワンポイント・アドバイス

PL/Iを初めて触る方が最初に躓くのが「宣言(DCL)」です。

  • `FIXED BIN(15)`: これはJavaの `short` みたいなもの。
  • `CHAR(10)`: 固定長文字列。COBOLの `PIC X(10)` と同じですが、メモリの詰め方が少し違います。

PL/Iは「型」に対して非常に寛容です。自動的に型変換(キャスト)をやってくれるので便利ですが、それが時にバグの温床にもなります。だからこそ、今回紹介した `VERIFY` のように、「入り口でデータをしっかりチェックする」という癖をつけることが、堅牢なシステムを作る第一歩になります。

まとめ

1. `PACKAGE` と `PROCEDURE OPTIONS(MAIN)` でプログラムの骨組みを作る。
2. `VERIFY` 関数 は「許容範囲外の文字」を探し出す便利ツール。
3. 戻り値が「0」なら合格、「0以外」なら不合格。これだけ覚えれば大丈夫です。

「レガシー」という言葉は、決して「古い」という意味ではありません。「長い時間をかけて磨き上げられた、信頼の証」だと私は思っています。皆さんが書くその一行が、明日も日本の基幹システムを支える力になることを心から応援しています。

何か不明点があれば、またいつでも聞いてくださいね。一緒に紐解いていきましょう!

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