Autonomous DatabaseからのWebサービス呼出し
Autonomous DatabaseからWebサービスをコールするためのオプションについて説明します。
Autonomous DatabaseからWebサービスを呼び出すには、次のような多くのオプションがあります。
-
DBMS_CLOUD
REST APIの使用:DBMS_CLOUD.SEND_REQUEST
ファンクションは、HTTPリクエストを開始し、レスポンスを取得して、レスポンスを終了しますこのファンクションは、引数を含むクラウドREST APIリクエストを送信するためのワークフローを提供し、ファンクションはレスポンス・コードおよびペイロードを返します。詳細は、SEND_REQUESTファンクションおよびプロシージャを参照してください。 -
Oracle APEXの使用: Autonomous DatabaseインスタンスのAPEXから、SOAPとRESTfulの両方のスタイルのWebサービスを操作できます。詳細は、Oracle APEXでのWebサービスの使用を参照してください。
-
UTL_HTTP
を使用して、パブリック・サイトにリクエストを送信します。詳細は、パブリック・ホストへのHTTPリクエストの発行を参照してください。 -
UTL_HTTP
を使用して、リクエストをプライベート・サイトに送信します。詳細は、プライベート・ホストへのHTTPリクエストの発行を参照してください。Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合は、
UTL_HTTP
、DBMS_LDAP
、UTL_SMTP
またはUTL_TCP
の手順で顧客管理ウォレットを使用できます。詳細は、顧客管理Walletを使用した外部コールの実行を参照してください。
Autonomous DatabaseでのUTL_HTTP
の制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。
トピック
- パブリック・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してパブリック・ホストでHTTPリクエストを送信するための詳細を提供します。 - プライベート・ホストへのHTTPリクエストの送信
プライベート・ホストでHTTPリクエストを送信するためにUTL_HTTP
を使用するステップについて説明します。 - プロキシを使用したプライベート・サイトへのHTTPリクエストの発行
Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合は、プロキシを使用してUTL_HTTP
でHTTPリクエストを送信できます。 - 資格証明オブジェクトを使用したHTTP認証の設定
資格証明オブジェクトをUTL_HTTP.SET_CREDENTIAL
プロシージャに渡す方法について説明します。 - Oracle APEXまたはデータベース・アクションを使用したHTTPリクエストの送信に関するノート
Oracle APEX SQLコマンドまたはデータベース・アクションのSQLワークシートを使用して複数の順次SQLコマンドを実行すると、前の文の状態を保存しない様々なデータベース・セッションでコマンドを実行できます。この動作は、データベースへの永続接続を維持するSQL*PlusやSQL DeveloperなどのデスクトップSQLクライアントとは異なります。
親トピック: タスク
パブリック・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してパブリック・ホストでHTTPリクエストを送信するための詳細を提供します。
たとえば、パブリック・ホストwww.example.comのHTTPリクエストを送信するには、ホストのアクセス制御リストを作成します。
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => 'www.example.com',
ace => xs$ace_type( privilege_list => xs$name_list('http'),
principal_name => 'ADMIN',
principal_type => xs_acl.ptype_db));
END;
次に、HTTPリクエストを送信します。
SELECT UTL_HTTP.REQUEST(url => 'https://www.example.com/') FROM dual;
Autonomous Databaseインスタンスがプライベート・エンドポイントにあり、パブリック・ホストへの
UTL_HTTP
コールをプライベート・エンドポイントVCNエグレス・ルールの対象にする場合は、ROUTE_OUTBOUND_CONNECTIONS
データベース・プロパティをPRIVATE_ENDPOINT
に設定します。
詳細は、プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化を参照してください。
Autonomous DatabaseでのUTL_HTTP
の制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。
プライベート・ホストへのHTTPリクエストの送信
UTL_HTTP
を使用してプライベート・ホストでHTTPリクエストを送信するステップについて説明します。
プライベート・エンドポイントのターゲット・ホストにリクエストを送信するには、ソース・データベースのOracle Cloud Infrastructure VCNからターゲット・ホストにアクセスできる必要があります。たとえば、次の場合にターゲット・ホストに接続できます。
-
ソース・データベースとターゲット・ホストの両方が同じOracle Cloud Infrastructure VCNにあります。
-
The source database and the target host are in different Oracle Cloud Infrastructure VCNs that are paired.
-
ターゲット・ホストは、FastConnectまたはVPNを使用してソース・データベースのOracle Cloud Infrastructure VCNに接続されているオンプレミス・ネットワークです。
Autonomous Databaseがプライベート・エンドポイントにある場合は、顧客管理ウォレットを使用してUTL_HTTP
コールを実行することもできます。詳細は、顧客管理Walletを使用した外部コールの実行を参照してください。
プライベート・エンドポイントのターゲットにUTL_HTTP
リクエストを作成するには:
-
ホストのアクセス制御リストを作成します。
たとえば:
BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'www.example.com', ace => xs$ace_type( privilege_list => xs$name_list('http'), principal_name => 'ADMIN', principal_type => xs_acl.ptype_db), private_target => TRUE); END; /
この例に示すように、ホストのアクセス制御リストを作成するときに、
private_target
パラメータに値TRUE
を指定します。ノート
ROUTE_OUTBOUND_CONNECTIONS
をPRIVATE_ENDPOINT
に設定した場合、このAPIではprivate_target
パラメータをTRUE
に設定する必要はありません。詳細は、プライベート・エンドポイントを使用したアウトバウンド接続のセキュリティの強化を参照してください。 -
HTTPリクエストを発行します。
SELECT UTL_HTTP.REQUEST( url => 'https://www.example.com/', https_host => 'www.example.com') FROM dual;
Autonomous DatabaseでのUTL_HTTP
の制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。
プロキシを使用したプライベート・サイトへのHTTPリクエストの送信
Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、プロキシを使用してUTL_HTTP
でHTTPリクエストを送信できます。
Autonomous Databaseインスタンスがプライベート・エンドポイントにある場合、ターゲット・プロキシでUTL_HTTP
を使用するには、ソース・データベースのOracle Cloud Infrastructure VCNからターゲット・プロキシにアクセスできる必要があります。
たとえば、次の場合にプロキシを使用して接続できます。
-
ソース・データベースとプロキシ・サーバーの両方が同じOracle Cloud Infrastructure VCNにあります。
-
The source database and the proxy server are in different Oracle Cloud Infrastructure VCNs that are paired.
-
プロキシ・サーバーは、FastConnectまたはVPNを使用してソース・データベースのOracle Cloud Infrastructure VCNに接続されているオンプレミス・ネットワークです。
また、顧客管理ウォレットを使用してUTL_HTTP
コールを実行することもできます。詳細は、顧客管理Walletを使用した外部コールの実行を参照してください。
UTL_HTTP
でプロキシ・サーバーを使用するには:
UTL_HTTP.SET_PROXY
を使用したプロキシ・サーバーの設定に関するノート:
-
DBMS_CLOUD
リクエストは、UTL_HTTP.SET_PROXY
で設定したプロキシ・サーバーを使用しません。これには、DBMS_CLOUD.SEND_REQUEST
と、DBMS_CLOUD.CREATE_EXTERNAL_TABLE
、DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE
またはDBMS_CLOUD.CREATE_HYBRID_PART_TABLE
で定義したDBMS_CLOUD
外部表に対するすべてのオブジェクト・ストレージ・アクセスが含まれます。 -
APEX_WEB_SERVICE
リクエストは、UTL_HTTP.SET_PROXY
で設定したプロキシ・サーバーを使用しません。
Autonomous DatabaseでのUTL_HTTP
の制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。
資格証明オブジェクトを使用したHTTP認証の設定
資格証明オブジェクトをUTL_HTTP.SET_CREDENTIAL
プロシージャに渡す方法について説明します。
UTL_HTTP.SET_CREDENTIAL
プロシージャでは、HTTP要求ヘッダーにHTTP認証情報が設定されます。Webサーバーが要求を認証するにはこの情報が必要です。
UTL_HTTP.SET_CREDENTIAL
プロシージャを使用すると、資格証明オブジェクトを渡してHTTP認証を設定できます。資格証明オブジェクトはスキーマ・オブジェクトであるため、権限のあるユーザーのみがアクセスでき、資格証明を制御するためのスキーマ・レベルの権限を構成できます。資格証明オブジェクトの受渡しは、認証に使用するユーザー名/パスワード/キーを格納および管理するための適切で安全な方法です。
UTL_HTTP.SET_CREDENTIAL
プロシージャは、UTL_HTTP.SET_AUTHENTICATION
プロシージャのかわりに安全で便利なプロシージャです。
例
...
UTL_HTTP.SET_AUTHENTICATION (l_http_request, 'web_app_user', 'xxxxxxxxxxxx');
...
前述の例に示すように、SET_AUTHENTICATION
プロシージャを起動する場合は、PL/SQL仮パラメータの一部としてユーザー名/パスワードをクリア・テキストで渡す必要があります。ユーザー名/パスワードを様々なPL/SQL自動化またはcronスクリプトに埋め込む必要がある場合があります。クリア・テキスト・パスワードを渡すことは、 UTL_HTTP.SET_CREDENTIAL
プロシージャで解決されるコンプライアンスの問題です。
詳細は、SET_AUTHENTICATIONプロシージャおよびSET_AUTHENTICATION_FROM_WALLETプロシージャを参照してください。
UTL_HTTP.SET_CREDENTIAL
構文
UTL_HTTP.SET_CREDENTIAL (
r IN OUT NOCOPY req,
credential IN VARCHAR2,
scheme IN VARCHAR2 DEFAULT 'Basic',
for_proxy IN BOOLEAN DEFAULT FALSE);
SET_CREDENTIAL
プロシージャで資格証明オブジェクトを渡す例:
-
資格証明オブジェクトを作成します。
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'HTTP_CRED', username => 'web_app_user', password => '<password>' ); END;
これにより、格納されたユーザー名/パスワードのペアを作成する資格証明オブジェクトが作成されます。
詳細は「CREATE_CREDENTIALプロシージャ」を参照してください。
詳細は、スケジューラ・ジョブ資格証明の指定を参照してください。
-
UTL_HTTP.SET_CREDENTIAL
プロシージャを起動します。DECLARE l_http_request UTL_HTTP.REQ; BEGIN l_http_request := UTL_HTTP.BEGIN_REQUEST('https://www.example.com/v1/dwcsdev/NAME/dwcs_small_xt1.csv'); UTL_HTTP.SET_CREDENTIAL (l_http_request, 'HTTP_CRED','BASIC'); ... END;
この例では、最初に
BEGIN_REQUEST
プロシージャを起動してリクエストを作成し、SET_CREDENTIAL
プロシージャを起動してHTTPリクエスト・ヘッダーにHTTP認証情報を設定します。Webサーバーが要求を認証するにはこの情報が必要です。値l_http_request
はHTTPリクエスト、HTTP_CRED
は資格証明名、BASIC
はHTTP認証スキームです。
詳細は、UTL_HTTPを参照してください。
Autonomous DatabaseでのUTL_HTTP
の制限の詳細は、Autonomous DatabaseのPL/SQLパッケージ・ノートを参照してください。
Oracle APEXまたはデータベース・アクションを使用したHTTPリクエストの送信に関するノート
Oracle APEXのSQLコマンドまたはデータベース・アクションのSQLワークシートを使用して複数の順次SQLコマンドを実行すると、前の文の状態を保存しない様々なデータベース・セッションでコマンドを実行できます。この動作は、データベースへの永続接続を維持するSQL*PlusやSQL DeveloperなどのデスクトップSQLクライアントとは異なります。
Autonomous DatabaseインスタンスへのOracle APEX SQLコマンドおよびデータベース・アクションSQLワークシートの発行はステートレスです。つまり、個々のSQL文およびPL/SQL文を実行すると、ウォレットを使用するコマンドを発行するときなどに、データベース・メモリーの状態が保存されますが、次の文を実行する前に状態がクリアされる場合があります。
Autonomous Databaseに送信するSQLコマンドの文実行間でデータベース・メモリーの状態を維持するステップは、次の表を参照してください。
SQLコマンド・ツール | ブロックとしての文の発行 |
---|---|
データベース・アクションSQLワークシート |
|
Oracle APEX SQLコマンド |
APEX SQLコマンドでは、個々の文の実行のみがサポートされます。複数の文を実行する場合は、1つのPL/SQL無名ブロックで文をラップする必要があります。APEX SQLコマンドでブロックを実行するには、「実行」をクリックします。 |
たとえば、次のコード・ブロックを使用して、顧客管理Walletを使用するutl_http.request()
コマンドを実行します。
SELECT utl_http.request(url => 'https://api.example.com/', wallet_path => 'file:path_to_wallet', wallet_password => 'password' ) FROM DUAL";
これを、1つのコード・ブロックとしてではなく、utl_http.set_wallet()
コマンドおよびutl_http.request()
文を個別に実行すると失敗する可能性のある2つの連続した文と比較します。
EXEC utl_http.set_wallet('file:WALLET_DIR/wallet.sso', 'password');
SELECT utl_http.request('https://api.example.com/') FROM DUAL;