1. 導入:なぜデータが消えるのか?
メインフレームでPL/Iを扱っていると、代入先よりも長い文字列を代入した際、何の警告もなく末尾が切り捨てられる経験をしたことはありませんか?例えば「10桁の変数に12桁の文字列を代入してもエラーにならない」というPL/Iの仕様は、時に重大なバグの原因となります。この記事では、この「静かなデータ欠落」をシステム的に検知するための仕組み「STRINGSIZE条件」について解説します。
2. 基礎知識:PL/Iの「切り捨て」とは
PL/Iでは、代入時にターゲットのデータ長が不足している場合、デフォルトではエラーを出さずに「後ろから削る」動作をします。これを「切り捨て(Truncation)」と呼びます。
STRINGSIZE条件とは、この切り捨てが発生した瞬間にプログラムへ通知を行うための仕組みです。プログラムの冒頭で「監視を有効にする(Enable)」設定を行うことで、データの整合性を守るガードレールとして機能させることができます。
3. 実装/解決策:監視の有効化
この条件を利用するには、コンパイルオプションでの指定、またはプログラムソース内でのプレフィックス指定が必要です。最も簡単な方法は、エラーが発生した際に特定の処理(ログ出力や異常終了)を行う「ON-Units」を定義することです。
4. サンプルプログラム:エラーを検知してログを出そう
以下に、STRINGSIZE条件を使ってデータ欠落を検知するサンプルコードを示します。
プログラム:
/ STRINGSIZE条件の有効化 /
(STRINGSIZE): PROCEDURE OPTIONS(MAIN);
/ 異常発生時の処理を定義 /
ON STRINGSIZE BEGIN;
PUT SKIP LIST(‘警告: 文字列の切り捨てが発生しました!’);
/ ここにログ出力処理やエラーハンドリングを記述 /
END;
DCL TARGET_VAR CHAR(5); / 5桁の変数 /
DCL SOURCE_VAR CHAR(10) INIT(‘ABCDEFGHIJ’); / 10桁のデータ /
/ ここで切り捨てが発生するため、ON-Unitsが呼び出されます /
TARGET_VAR = SOURCE_VAR;
PUT SKIP LIST(‘結果: ‘ || TARGET_VAR); / 結果は ‘ABCDE’ となります /
END;
5. 応用・注意点:現場での運用とモダン化
現場でこの機能を使う際の注意点を3つ挙げます。
1. パフォーマンスへの影響
STRINGSIZE条件は実行時に常にチェックを行うため、多用するとプログラムの実行速度に影響が出ます。本番環境での運用時は、必要最小限の箇所に絞るか、テスト環境での品質確認用として割り切る判断も必要です。
2. 現代言語への移行を見据えて
もし将来的にJavaやC#などのモダン言語へ移行する計画があるなら、この条件を有効にすることは非常に重要です。移行先の言語では「データ長オーバー」は例外(Exception)として処理されるのが一般的だからです。今からPL/I上で明示的にエラーを検知しておくことで、システム全体の信頼性が高まります。
3. DBとの整合性
DBのカラム長とPL/Iの変数長が不一致である場合、この条件が頻発します。プログラム側で無理に切り捨てるのではなく、バリデーションロジックを見直す良いきっかけにしましょう。
「なんとなく動いている」プログラムを「意図通りに動く」プログラムに変えるために、ぜひSTRINGSIZE条件を活用してみてください。

コメント