パッケージDBMS_DEVELOPERについては、Oracle CorporationのDatabase ToolsのPMのJeff Smithさんによる記事「Oracle Database 23ai VirtualBox 23.7 & DBMS_DEVELOPER」に紹介されています。DBMS_DEVELOPERには、データベース・オブジェクトのメタデータ(定義情報)をJSONで返すファンクションGET_METADATAが含まれます。というか、今のところ、そのファンクションしかありません。表のメタデータの取り出しは(特にデータベース・オブジェクトが多数ある場合)比較的重い処理になりますが、DBMS_DEVELOPERのGET_METADATAは、高速にメタデータが返されるようになっています。直接の比較ではありませんが、Jeff Smithさんは彼の記事で、DBMS_METADATA.GET_DDLはDBMS_DEVELOPER.GET_METADATAと比較して20,000%遅いと言っています。
そのDBMS_DEVELOPER.GET_METADATAですが、戻り値の型はJSONです。PL/SQLでJSONを扱うより、JavaScriptの方が簡単に記述できます。23.7ではJavaScriptからPL/SQLを簡単に呼び出せるPL/SQL Foreign Function Interfaceが追加されました。このインタフェースを使って、JavaScriptからDBMS_DEVELOPERを呼び出してみます。
この両方の機能を使って表に定義されている列をJSON配列として返す、簡単なAPEXアプリケーションを作成してみました。以下のように動作します。
上記のアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/dbms-developer-get-metadata.zip
以下より、簡単にアプリケーションの説明をします。機能はすべてホーム・ページに実装しています。
APEXアプリケーションのパーシング・スキーマに含まれる表を、タイプがポップアップLOVのページ・アイテムP1_TABLEとして選択できるようにしています。
DBMS_DEVELOPER.GET_METADATAで取得したJSONドキュメントより列を取り出した結果は、タイプがテキスト領域のページ・アイテムP1_COLUMNSに出力します。
ボタンPLSQLを押したときは以下のPL/SQLのコードを実行して、DBMS_DEVELOPER.GET_METADATAを呼び出して得られたメタデータより列を取り出します。
declare
l_json json;
l_columns varchar2(32767);
begin
select dbms_developer.get_metadata(:P1_TABLE) into l_json;
select json_arrayagg(name) into l_columns from
(
select name from json_table(
l_json,
'$.objectInfo.columns[*]'
columns
name varchar2(40) path '$.name'
)
);
:P1_COLUMNS := l_columns;
end;
ボタンJavaScriptを押したときは以下のJavaScriptのコードを実行して、PL/SQL FFI経由でDBMS_DEVELOPER.GET_METADATAを呼び出して得られたメタデータより列を取り出します。
const dbmsDeveloper = plsffi.resolvePackage('DBMS_DEVELOPER');
const metadata = dbmsDeveloper.get_metadata(apex.env.P1_TABLE);
const columns = metadata.objectInfo.columns;
const columnNames = columns.map(column => column.name);
apex.env.P1_COLUMNS = JSON.stringify(columnNames);
MLEでJavaScriptを実行するには、パーシング・スキーマにJavaScriptの実行権限が必要です。
grant execute on javascript to <パーシング・スキーマ>:
Oracle Databaseの機能は主にパッケージとして提供されているため、PL/SQL FFI経由でJavaScriptから簡単に呼び出せることより、JavaScriptでサーバー側の処理を記述するハードルが下がったように思います。
今回の記事は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完