2020年8月21日金曜日

APEXコレクションを対話グリッドで扱う

 社内の質問箱に、APEXコレクションを対話グリッドで扱うには?という質問があったので、試しに実装してみました。

そもそもAPEXコレクションとは?

マニュアルのこちらに説明があります。開始されたセッションに紐づけて、データを保存や参照をすることができます。

データベースの一時表に似ていますが、Oracle APEXのそれぞれのリクエストは異なるデータベースのセッションで処理が行われるため、データベースのセッションに紐づけて行を保存する一時表は使えません。

APEX_COLLECTIONの初期化


セッションの開始後に、アプリケーション・プロセスなどでコレクションを作成します。以下の例ではコレクションの名前をTESTにしています。
apex_collection.create_or_truncate_collection(
p_collection_name => 'TEST'
);

対話グリッドの定義


ソースとして与えるSQLの例は以下になります。SEQ_IDを主キーとして扱うので、これは必ず含めます。それ以外はデータの保存に使用している列を含めます。以下の例ではC001とC002です。それ以外のカラムも必要にしたがって追加することができます。


SQL問合せの本文は以下になります。
select
       SEQ_ID,
       C001,
       C002
  from APEX_COLLECTIONS
where collection_name = 'TEST'
属性の編集有効にします。


主キーとなる列SEQ_IDの設定です。タイプ非表示とし、主キーONにします。


プロセスの設定


対話グリッド上でデータが編集し保存を実行すると、変更分のみがサーバーへ送信されます。SQLのINSERT/UPDATE/DELETE文をAPEXコレクションに実行することはできないため、それに対応した処理をPL/SQLコードとして記述します。


ターゲット・タイプPL/SQL Codeとし、行のロックNoに設定します。コードには以下を記述します。

挿入、更新、削除に対応したAPEX_COLLECTION APIをそれぞれ呼び出しているだけですので、コードの理解は難しくはないかと思います。

このように実装することで、APEXコレクションを対話グリッドで扱うことが可能になります。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/collection-and-grid.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。