【入門編】プリコンパイル時におけるホスト変数(Host Variables)の宣言規則 – PL/Iの基本構文とデータ制御実践ガイド

PL/IでDB2を操る!「DECLARE SECTION」とホスト変数のきほんの「き」

こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLの現場からメインフレームに飛び込むと、PL/I(ピーエル・ワン)という言語が、まるで「古の魔法の呪文」のように見えてしまうことがあるかもしれませんね。

特にDB2(データベース)を扱う際、SQLをソースコードに埋め込む「埋め込みSQL」の世界では、独特のルールに戸惑うこともあるでしょう。今日は、PL/IでDB2を扱うための必須儀式、「ホスト変数の宣言」について、現場の知見を交えながら優しく紐解いていきましょう。

1. PL/Iには「予約語」がない?衝撃の事実

まず最初に、PL/Iの少し変わった性格をご紹介します。
JavaやCOBOLには「予約語(ifやwhileなど、変数名として使ってはいけない単語)」が厳格に決まっていますよね。ところがPL/Iは、「文脈で判断する」という非常に柔軟(というか、少し大雑把な)言語なんです。

例えば、`IF` という名前の変数を作っても、PL/Iは文脈を読んで「ああ、これは条件分岐のIFではなく、変数だな」と理解してくれます。
「じゃあ何でもありなの?」と思われるかもしれませんが、これは罠でもあります。安易に `IF` や `SELECT` を変数名にすると、コードを読む人間(そして未来のあなた自身)が確実に混乱します。

教訓: 予約語がないからといって、無秩序に命名するのはNGです。現場では命名規則(例:`W-`で始まる変数はワーク用など)を厳格に守るのが、プロのたしなみですよ。

2. なぜ「DECLARE SECTION」が必要なの?

DB2のSQL文の中で、PL/Iの変数を値の受け渡しに使いたいとき、その変数を「ホスト変数」と呼びます。
ここでJavaエンジニアの皆さんが一番驚くのが、「わざわざ `EXEC SQL BEGIN DECLARE SECTION` で囲まないといけない」というルールです。

これは、DB2のプリコンパイラ(ソースコードを解析してDB2が理解できる形に翻訳するツール)に対する、「ここから先はSQLで使う変数のリストですよ、しっかりチェックしてくださいね!」という合図なんです。

実際のコード例を見てみましょう

1
/ プリコンパイル時の儀式:宣言の始まり /
EXEC SQL BEGIN DECLARE SECTION;

/ 顧客番号:PIC X(10) はCOBOLっぽいですが、PL/Iではこう書きます /
DCL H-CUST-ID CHAR(10);

/ 顧客残高:固定小数点数(11桁、小数点以下2桁) /
DCL H-BALANCE DEC FIXED(11, 2);

/ インジケータ変数:NULL値の判定に必須! /
DCL H-BAL-IND BIN FIXED(15);

EXEC SQL END DECLARE SECTION;

このように、`BEGIN` と `END` で囲むことで、プリコンパイラは「ああ、この変数はDB2と会話するために使われるんだな」と認識します。この囲いを忘れると、コンパイルエラーの嵐に巻き込まれることになるので注意してくださいね。

3. データ型マッピングの「落とし穴」

PL/Iの型とDB2の型は、一見似ていますが「アライメント」や「精度」で相性問題が出ることがあります。特に以下の組み合わせは、基幹システムでよく遭遇する定番です。

| PL/Iの型(例) | DB2の型(例) | ポイント |
| :— | :— | :— |
| `CHAR(10)` | `CHAR(10)` | 固定長文字列。余白は空白で埋められます。 |
| `VARCHAR(10)` | `VARCHAR(10)` | PL/I側は構造体で定義します(少し特殊な形式)。 |
| `DEC FIXED(11, 2)` | `DECIMAL(11, 2)` | 金額計算の鉄板。誤差が出ないよう桁数を合わせます。 |
| `BIN FIXED(15)` | `SMALLINT` | フラグやインジケータに最適です。 |

現場のワンポイント:NULL値との付き合い方

データベースの世界では「値がない(NULL)」状態がありますが、PL/Iの変数自体はNULLになれません。そこで登場するのが「インジケータ変数(H-BAL-IND)」です。

SQL文を実行する際、`INTO :H-BALANCE :H-BAL-IND` のように変数を並べると、もしDB2側の値がNULLなら、`H-BAL-IND` に `-1` が入ります。これを確認せずに計算処理に進むと、システムが異常終了(アベンド)する原因になります。「値を受け取ったら、まずインジケータをチェックする」。これがバグを未然に防ぐ最大のコツです。

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

PL/Iのソースコードを初めて見ると、独特の記号や宣言方法に圧倒されるかもしれません。でも、一つひとつは「SQLとプログラムの間で、どうやってデータを仲介するか」という論理的なルールに過ぎません。

「DECLARE SECTION」という箱は、言ってみれば「DB2とPL/Iが握手するための応接室」のようなものです。このルールさえ守れば、メインフレームの強力なデータ処理能力を自由に操れるようになりますよ。

もしコンパイルエラーが出ても大丈夫。それはシステムが「もう少し丁寧に教えてね」と言っているだけです。一つずつ紐解いていけば、必ず解決できます。一緒に頑張りましょう!


何か特定の型変換や、構造体(STRUCT)を使った複雑なデータ操作で迷ったら、いつでも聞いてくださいね。アーキテクトとして、また現場の先輩としていつでもサポートします!

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