UTL_HTTPでの指定は以下のようになります。Oracle Corporationに所属しているMartin BachさんのブログUsing the JavaScript fetch API in Oracle Database 23aiを参照しています。
begin
utl_http.set_wallet('system:');
end;
/
Oracle Database 23ai FreeにインストールしたAPEXで、ウォレットのパスとしてsystem:を指定できるかどうか確認してみました。結果としては動作したので、Oracle Database 23aiからは、Oracle APEXの環境構築の際にOracle Walletを作成する必要が無くなっています。
2024年6月19日追記
Oracle APEX 24.1をOracle Database 23aiにインストールした場合は、ウォレット・パスが未指定であればsystem:を参照するようになりました。そのため、APEXでもウォレットに関する設定は不要になりました。
追記終わり
Oracle APEXの管理サービスにアクセスし、インスタンスの管理からインスタンスの設定を開きます。ウォレットのセクションのウォレット・パスはデフォルトで未指定です。
インスタンスの設定の電子メールのOracle APEXインスタンスのURLおよびOracle APEXのイメージURLはデフォルトで無指定ですが、必須項目です。変更を適用する際は値の指定が必須なので、デフォルトURLをクリックして設定しておきます。
この状態で、APEXのワークスペースよりAPEX_WEB_SERVICE.MAKE_HTTP_REQUESTを呼び出してみます。最初は引数p_wallet_pathをコメント・アウトします。
declare
l_clob clob;
begin
l_clob := apex_web_service.make_rest_request(
p_url => 'https://oracle.com'
,p_http_method => 'GET'
-- ,p_wallet_path => 'system:'
);
dbms_output.put_line(substr(l_clob, 1, 100));
end;
p_urlに指定しているプロトコルがhttpsであるため、ウォレットの指定が無いとORA-29024: 証明書の検証に失敗したが発生します。
p_wallet_pathのコメント・アウトを解除して、再度実行します。
ORA-29024は発生せず、コンテンツの取得ができています。ウォレット・パスに与えているsystem:は新しく追加された指定ですが、Oracle APEXのAPEX_WEB_SERVICEパッケージはp_wallet_pathへのsystem:の指定を、UTL_HTTP.SET_WALLETの引数として渡せています。
管理サービスを開き、インスタンスの設定のウォレット・パスとしてsystem:を設定します。この設定はAPEX_WEB_SERVICE.MAKE_REST_REQUESTの引数p_wallet_pathのデフォルト値になります。
APEXワークスペースより、再度同じ処理を実行します。引数p_wallet_pathをコメント・アウトしても、今度はエラーは発生しません。
APEX_WEB_SERVICE.MAKE_REST_REQUESTを呼び出すにあたって、ネットワークACLの追加が必要です。APEX 23.2の場合は、以下のようにprincipal_nameにAPEX_230200を指定します。
begin
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(
privilege_list => xs$name_list('connect'),
principal_name => 'APEX_230200',
principal_type => xs_acl.ptype_db));
commit;
end;
/
パッケージAPEX_WEB_SERVICEの所有者は(APEXのバージョンが23.2であれば)APEX_230200であり、MAKE_REST_REQUESTは定義者権限で動作します。APEX_WEB_SERVICEからHTTPのコールアウトを行う際にUTL_HTTPを呼び出されますが、定義者権限であるため、この呼び出しはパッケージAPEX_WEB_SERVICEの所有者であるAPEX_230200によって実行されることになります。そのためprincipal_nameをAPEX_230200としてネットワークACLを定義する必要があります。
今回参照した記事では、MLE JavaScriptよりHTTPのコールアウトを行なっています。これは接続しているスキーマで実行されるため、ネットワークACLはAPEXワークスペース・スキーマに対して許可する必要あります。また、APEXのインスタンス設定のウォレット・パスはあくまでAPEX_WEB_SERVICEからUTL_HTTPを呼び出す際に与えるウォレットのデフォルト値であるため、MLE JavaScriptではMartin Bachさんの記事にあるように、別途ウォレットを指定する必要があります。
今回の記事は以上になります。
完