メニューボタン
IBMi海外記事2026.08.06

RPGにおけるSQLシーケンスで、Db2にカウントさせる

自分の代わりにデータベースに数を数える処理をさせることには、何か深い満足感のようなものがあります。数十年もの間、IDを手作業で処理し、それらをロックで保護し、ジョブが別のジョブと衝突しないようにと願ってきたことからすると、SQLシーケンスは、一夜にして静かに再生するキノコの群生を見つけたような気にさせてくれます。無いことについて気をもむのは止めて、大事なことに目を向けるようにしましょう。

プロシージャー主導型RPGシステムにおいては、これはまさしく、他とは分離させて担わせたいと思うような責務です。新たなIDを生成することは、ビジネス ロジックではありません。検証でもありません。フォーマット処理でもありません。それは、きちんと定義された単一のホームに値する、きちんと定義された単一のアクションです。

それでは、そのようなホームを構築してみましょう。

まずは、この責務を本当に担うことになる、データベースから始めます。キノコ カタログでは、登録する項目ごとに一意のIDが必要です。手作業で値を登録し、増加させるのではなく、一意性および同時実行安全性を保証するシーケンス オブジェクトを作成します。

以下は、ライブラリーにMsh_Cat_Idという名前のシーケンスを作成する単純な例です。

CREATE SEQUENCE MYLIB.Msh_Cat_Id
    AS BIGINT
    START WITH 1
    INCREMENT BY 1
    NO MAXVALUE
    NO CYCLE
    CACHE 20;

この定義は、1から始まり、要求されるたびに1つずつ増加する、際限なく続く連続した数を生成するようにDb2に伝えます。キャッシュは、ディスクへのアクセスを減少させることによってパフォーマンスを改善します。これは、アプリケーションが大きくなり、多数のジョブが同時にIDを収集しているときには重要になります。

これで、データベースがIDを生成するという責務を担うことになったので、今度はRPGに移ります。目的は、このロジックを、必要とされるどこにでも組み込むことではありません。そんなことをすれば、責務を散乱させ、将来の変更は骨の折れる作業になるでしょう。代わりに、次の値を取得することを唯一の仕事とする単一のプロシージャーで、シーケンスへのアクセスをラップします。

ここが、プロシージャー主導型RPGが最も輝く場面です。このプロシージャーは、1つのことを行います。プロシージャーの名前が、それを明らかにしています。そして、すべての呼び出し元は、同じ一貫した挙動から恩恵を受けます。

以下は、そのようなプロシージャーの最小限のSQLRPGLEの例です。

dcl-proc Get_Next_Mushroom_Catalog_Id export;


  dcl-pi Get_Next_Mushroom_Catalog_Id packed(15:0);
  end-pi;

  dcl-s next_Id packed(15:0);

  Exec sql
    VALUES NEXT VALUE FOR MYLIB.Msh_Cat_Id
    INTO :next_Id;

  return next_Id;

end-proc Get_Next_Mushroom_Catalog_Id;

ここには余計なロジックはありません。何も必要ではないからです。このプロシージャーは、意図を明確にした、シーケンスに対するシン ラッパーです。それは、検証、変換、または解釈を行いません。取得するだけです。この単純さは、設計の欠如ではありません。それは優れた設計の結果です。より多くのことを行いたいという衝動を抑えることによって、明快性が維持されます。明日急に、要件が変更(たとえば、IDにプレフィックスが必要となる、ソースが変わるなど)されても、私たちはどこに行くべきか正確に分かります。1つのプロシージャー、1つの責務ということです。

プロシージャーの使い方は、同じように簡単です。

dcl-s catalogId packed(15:0);

catalogId = GetNextMshCatId();

このたった1行により、データ域、ロック、エラー処理を必要とさせ、同時実行性についての静かな不安感を生じさせていたものが置き換えられます。これで、データベースは正確性を保証し、プロシージャーはアクセスの一貫性を保証します。

このように、SQLシーケンスと、焦点を絞った小さなRPGプロシージャーを組み合わせることは、最新の機能がどのようにプロシージャー主導型アプローチに自然にフィットするかを表す絶好の例です。データベースは一番得意なことを処理します。RPGは、明快で意図の明確なプロシージャーを通じて全体を指揮します。

林床の下の健全な菌糸ネットワークとよく似ていて、システムの強さは、いずれか1つの構成要素にあるのではなく、それぞれの構成要素がどれくらいきれいに次の要素に繋がるかにあります。

それでは、また、次回の記事で。楽しいコーディングを。

あわせて読みたい記事

PAGE TOP