2023年3月10日金曜日

APEX_UTIL.HOST_URL、ORDS別名、アプリケーション別名を確認するアプリ

 Oracle APEXのページやORDSのRESTサービスを呼び出す直リンクを作成したい場合があります。APEXアプリケーションが動作しているホスト名やワークスペース名などを文字列として取得する必要があるため、通常はAPEX_UTIL.HOST_URLを呼び出します。

HOST_URLに与える引数p_optionには、NULL(引数なし)、SCRIPT、APEX_PATH、IMGPREがあります。マニュアルにどのような値が返ってくるか説明はあります。しかし、返される値はOracle APEXがどのようにインストールおよび構成されているか依存するため、実際にどのような値が返ってくるか、今ひとつ分かりにくいです。

結局、APEXが動作している環境で呼び出して確認するのが手っ取り早いので、以下のPL/SQLコードを書きました。動的コンテンツのリージョンのソースになります。HOST_URL以外にAPEXワークスペース名、ORDS別名、アプリケーション別名なども印刷しています。

declare
l_clob clob;
l_result varchar2(4000);
procedure append(
p_clob in out clob
,p_string in varchar2
,p_bold in boolean default false)
as
begin
if p_bold then
p_clob := p_clob || '<p><b>' || p_string || '</b></p>';
else
p_clob := p_clob || '<p>' || p_string || '</p>';
end if;
end append;
begin
l_clob := '<p><b>APEXの場合はapex_page.get_urlがあるため、apex_util.host_urlが必要なケースは少ない。</b></p>';
l_result := apex_util.host_url();
append(l_clob, q'~apex_util.host_url()~', true);
append(l_clob, l_result);
l_result := apex_util.host_url('SCRIPT');
append(l_clob, q'~apex_util.host_url('SCRIPT')~', true);
append(l_clob, l_result);
l_result := apex_util.host_url('APEX_PATH');
append(l_clob, q'~apex_util.host_url('APEX_PATH')~', true);
append(l_clob, l_result);
l_result := apex_util.host_url('IMGPRE');
append(l_clob, q'~apex_util.host_url('IMGPRE')~', true);
append(l_clob, l_result);
/* ワークスペース名 */
select workspace into l_result from apex_workspaces where workspace_id = :WORKSPACE_ID;
append(l_clob, q'~ワークスペース名~', true);
append(l_clob, q'~select workspace into l_result from apex_workspaces where workspace_id = :WORKSPACE_ID~', true);
append(l_clob, l_result);
/* ORDS別名 */
select pattern into l_result from user_ords_schemas where parsing_schema = sys_context('USERENV','CURRENT_USER');
append(l_clob, q'~ORDS別名~', true);
append(l_clob, q'~select pattern into l_result from user_ords_schemas where parsing_schema = sys_context('USERENV','CURRENT_USER')~', true);
append(l_clob, l_result);
/* アプリケーション別名 */
l_result := utl_url.escape(lower(:APP_ALIAS), false, 'AL32UTF8');
append(l_clob, q'~アプリケーション別名 - ただし日本語などを設定しなければ lower(:APP_ALIAS)で十分~', true);
append(l_clob, q'~utl_url.escape(lower(:APP_ALIAS), false, 'AL32UTF8')~', true);
append(l_clob, l_result);
/* それ以外の確認方法 */
l_result := owa_util.get_cgi_env('X-APEX-BASE');
append(l_clob, q'~owa_util.get_cgi_env('X-APEX-BASE')~', true);
append(l_clob, l_result);
l_result := owa_util.get_cgi_env('SCRIPT_NAME');
append(l_clob, q'~owa_util.get_cgi_env('SCRIPT_NAME')~', true);
append(l_clob, l_result);
l_result := owa_util.get_cgi_env('SCRIPT_PREFIX');
append(l_clob, q'~owa_util.get_cgi_env('SCRIPT_PREFIX')~', true);
append(l_clob, l_result);
l_result := owa_util.get_cgi_env('PATH_INFO');
append(l_clob, q'~owa_util.get_cgi_env('PATH_INFO')~', true);
append(l_clob, l_result);
l_result := owa_util.get_cgi_env('PATH_PREFIX');
append(l_clob, q'~owa_util.get_cgi_env('PATH_PREFIX')~', true);
append(l_clob, l_result);
return l_clob;
end;

APEXアプリケーションに組み込んで実行すると、以下のように表示されます。


このアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/apex-util-host-url.zip

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