2020年7月14日火曜日

使用している共有LOVを調べる

Oracle APEXのアプリケーションを色々修正していて、気がついたら共有コンポーネントに結構な数のLOVが登録されていました。登録されているLOVが今でも使われているのか、削除してよいのか定かではないため、確認するためのアプリを作成してみました。


そもそも、Oracle APEXのアプリケーションはOracle Databaseの表に保存されたデータです。なので、アプリケーションのすべての定義情報はデータベースの表を検索することで取り出すことができます。

アプリケーションの定義情報や稼働ログなどは、ユーティリティApplication Expressビューで使用可能なビューの一覧を確認することができます。


Oracle APEX 20.1では178のビューが登録されています。


共有コンポーネントとして登録されているLOV名称の一覧は以下のSQLでリストを取得できます。ページ・アイテムP1_WORKSPACEはワークスペース名で、P1_APPLICATION_IDはアプリケーションIDです。APEX_APPLICATION_LOVSビューを参照しています。
select LIST_OF_VALUES_NAME from APEX_APPLICATION_LOVS
where workspace = :P1_WORKSPACE and application_id = :P1_APPLICATION_ID
ページ・アイテムで使用されている共有LOVの一覧は、以下のSQLで取得しました。APEX_APPLICATION_PAGE_ITEMSビューを参照しています。
select 'PAGE_ITEM' as type, page_id, region as region, item_name as name,
    lov_named_lov as LIST_OF_VALUES_NAME
from APEX_APPLICATION_PAGE_ITEMS
where workspace = :P1_WORKSPACE and application_id = :P1_APPLICATION_ID
    and lov_named_lov is not null
クラシック・レポートの列で使用されている共有LOVの一覧は、以下のSQLで取得しました。APEX_APPLICATION_PAGE_RPT_COLSビューを参照しています。
select 'Classic Report' as type, page_id, region_name as region, column_alias as name,
    named_list_of_values as LIST_OF_VALUES_NAME
from APEX_APPLICATION_PAGE_RPT_COLS
where workspace = :P1_WORKSPACE and application_id = :P1_APPLICATION_ID
    and named_list_of_values is not null
対話モード・レポートで使用されている共有LOVの一覧は、以下のSQLで取得しました。APEX_APPLICATION_PAGE_IR_COLビューを参照しています。
select 'IR' as type, page_id, region_name as region, column_alias as name,
    named_lov as LIST_OF_VALUES_NAME
from apex_APPLICATION_PAGE_IR_COL
where workspace = :P1_WORKSPACE and application_id = :P1_APPLICATION_ID
    and named_lov is not null
対話グリッドの列で使用されている共有LOVの一覧は、以下のSQLで取得しました。APEX_APPLICATION_PAGE_IG_COLUMNSビューを参照しています。
select 'IG' as type, g.page_id, g.region_name as region, g.name, 
    l.LIST_OF_VALUES_NAME as LIST_OF_VALUES_NAME
from APEX_APPL_PAGE_IG_COLUMNS g join APEX_APPLICATION_LOVS l on g.lov_id = l.lov_id
where g.workspace = :P1_WORKSPACE and g.application_id = :P1_APPLICATION_ID
   and l.list_of_values_name is not null
最終的に作成したアプリケーションのエクスポートを以下に置きました。
(APEX 22.2で作り直しています)
https://github.com/ujnak/apexapps/blob/master/exports/manage-shared-lovs.zip

ページ・アイテム、クラシック・レポート、対話モード・レポート、対話グリッドの列の他には共有コンポーネントのLOVを参照するOracle APEXのコンポーネントは無かったと思います。Unused Shared LOVsでリストされているLOVは削除可能なはずですが、もしかするとあるかもしれない(例えば、他のアプリケーションからサブスクライブされている、とか)ので、削除するときは十分気をつけてください。

Used Shared LOVsにリストされているコンポーネントは間違いなく使っているので、削除してはいけません。

追記

共有コンポーネントのLOVを開て、よく見ると、右側に使用状況が表示されていました。アプリを作る必要があまりありませんでした。


使われていない場合は、このLOVは使用されていません。と表示されます。