Skill Note

平凡なエンジニアがメモ代わりにプログラミング, インフラ, ネットワークを書き綴るブログ

[Oracle]WEBサイトやWEB APIをOracleから呼び出す方法

      2015/02/21

oracle

WEBリクエストを送信してレスポンスを表示する

OracleからWEBサイトやWEB APIなどのネットワークサービスを呼び出すには、UTL_HTTPパッケージを使用します。

今回は、UTL_HTTPパッケージを使用して、WEBサイトからのレスポンスを表示する方法を記載します。

環境

Oracle Express Edition 11g R2

UTL_HTTPパッケージとは?

UTL_HTTPパッケージは、SQLとPL/SQLからHypertext Transfer Protocol(HTTP)のコールアウトを行います。これを使用すると、HTTPを経由してインターネット上のデータにアクセスできます。

http://docs.oracle.com/cd/E16338_01/appdev.112/b56262/u_http.htm

パッケージ使用時の注意事項

Oracleではネットワークサービスへのアクセスはデフォルトで無効に設定されており、アクセス制御リスト(ACL)によりネットワークアクセスが拒否されます。

今回のようにWEBサイトにアクセスするためには、まず最初にDBMS_NETWORK_ACL_ADMINパッケージを使用して、ACLを設定する必要があります。

UTL_TCP,UTL_SMTP,UTL_MAILパッケージなどを使用する場合も同じようにACLを設定します

また、今記事のようにOracle Express Editionを使用する場合には、DBAユーザでUTL_HTTPの実行権限を付与する必要があります。

/* 実行権限の付与 */
GRANT EXECUTE ON SYS.UTL_HTTP TO SCOTT;

ACLの設定

ユーザにネットワークアクセス権限を付与するには、DBAユーザでACLの作成、アサインを実行します。

/* ACLの作成 */
BEGIN
	DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
		acl          => 'www.xml', -- ACL名
		description  => 'web access acl', -- 説明
		principal    => 'SCOTT', -- ユーザ名/ロール名
		is_grant     => TRUE, -- 権限を付与するか否か
		privilege    => 'connect'); -- UTL_HTTPパッケージの場合
END;
/

/* ACLのアサイン */
BEGIN
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => 'www.xml', -- ACL名
                                    host => 'skill-note.net'); -- ホスト名/IPアドレス ワイルドカードで指定することも可
  COMMIT; 
END;
/

Webサイトにアクセスする

次にACLを付与したユーザでログインしてHTTPリクエストを送信します。
REQUESTファンクションを使用して2000バイト分のレスポンスを表示します。

SELECT UTL_HTTP.REQUEST('http://skill-note.net') FROM DUAL;

下記のようなレスポンスが表示されることを確認します。

UTL_HTTP.REQUEST('HTTP://SKILL-NOTE.NET')
--------------------------------------------------------------------------------
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="ie6" lang="ja"> <![endif]-->
<!--[if IE 7]> <html class="i7" lang="ja"> <![endif]-->
<!--[if IE 8]> <html class="ie" lang="ja"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="ja"> <!--<![endif]-->
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp
.me/ns/article#">
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalabl
e=no">
<meta name="format-detection" content="telephone=no" />

UTL_HTTP.REQUEST('HTTP://SKILL-NOTE.NET')
--------------------------------------------------------------------------------

PL/SQLからHTTPリクエストを送信する場合。

/* PL/SQL REQUEST */
SET SERVEROUTPUT ON

BEGIN
	DBMS_OUTPUT.PUT_LINE(UTL_HTTP.REQUEST('http://skill-note.net'));
END;
/

下記のようなレスポンスが表示されることを確認します。

/* PL/SQL REQUEST */
SET SERVEROUTPUT ON

BEGIN
	DBMS_OUTPUT.PUT_LINE(UTL_HTTP.REQUEST('http://skill-note.net'));
END;
/

全てのレスポンスを取得したい場合は、GET_RESPONSEファンクションを使用します。
GET_RESPONSEで取得したHTTPレスポンスを一行毎表示します。

/* PL/SQL GET_RESPONSE */
SET SERVEROUTPUT ON

DECLARE 
	req   UTL_HTTP.REQ;
	resp  UTL_HTTP.RESP;
	value VARCHAR2(1024);
BEGIN
	req := UTL_HTTP.BEGIN_REQUEST('http://skill-note.net');
	UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/5.0');
	resp := UTL_HTTP.GET_RESPONSE(req);
	LOOP
		UTL_HTTP.READ_LINE(resp, value, TRUE);
		DBMS_OUTPUT.PUT_LINE(value);
	END LOOP;
	UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
	WHEN UTL_HTTP.END_OF_BODY THEN
	UTL_HTTP.END_RESPONSE(resp);
END;
/

ACL設定を削除する 

今回作成したACLを削除するにはDBAユーザで下記を実行します。

/* ACLの削除 */
BEGIN
	DBMS_NETWORK_ACL_ADMIN.DROP_ACL(acl  => 'www.xml');
END;
/

WEB API、WEBサービスを利用する方法は下記の記事に記載しています。

この記事は、下記のページを参考にして記載しています。

[amazonjs asin=”4797377070″ locale=”JP” title=”プロとしてのOracle PL/SQL入門 【第3版】(Oracle 12c、11g、10g対応) (Oracle現場主義)”]

Google AdSense PC

Google AdSense PC

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

oracle
[Oracle]データベースを再構築してOracle Expressのキャラクタセットを変更する

前回の記事でCSALTERを使用したキャラクタセットの変更方法を記載しましたが、サブセットのキャラクタセットからスーパセットへの変更のみ可能でした。 この記事で …

oracle
[Oracle]データベーストリガーの作成方法

DMLトリガーを作成する データベーストリガーの中でももっとも一般的なDMLトリガーの作成方法と簡単な使用方法を記載していきます。 トリガーとは? トリガーとは …

oracle
[Oracle]トリガーの実行順序を設定する方法

FOLLOWS句を使用して実行順序を設定する 1つの表に対して同レベル(タイミング)のトリガーを複数作成することはできますが、実行順序は保証されていません。 実 …

oracle
Oracleで文字列を全角大文字に変換する(ひらがな・カタカナの小文字(捨て仮名)対応)

Oracleの文字列検索で全角半角、大文字小文字、ひらがなカタカナを区別しないであいまい検索する場合は比較対象の文字列形式を統一する必要があります。 文字列形式 …

sqlserer
[SQLServer]形式指定で日付を取得する方法

SQLServerで形式を指定して日付を取得する 日付形式を指定するために、CONVERT関数、または、FORMAT関数を使用します。 CONVERT関数とFO …

oracle
Oracle12cでユーザを作成する方法

SQLコマンドを使用したユーザ作成 Oracle12cからマルチテナント・アーキテクチャが採用されており、以前までの手順ではユーザが作成できません。 ここではP …

oracle
[Oracle]端数処理、丸めの方法

ORACLEで数値の端数処理、数値丸めをする 数値を四捨五入する場合は、ROUND関数 数値を切り捨てる場合は、TRUNC関数 各関数の第2引数の値で、小数部、 …

sqlserer
[SQL Server]再帰SQLで集計する

WITH(共通テーブル式)を使って集計する WITH句とは 共通テーブル式 (CTE) は、単一の SELECT、INSERT、UPDATE、DELETE、CR …

oracle
[Oracle]ジョブをスケジューリングして定期実行する方法

DBMS_SCHEDULERパッケージを使用したジョブスケジューリング Oracleでジョブを定期実行するには、DBMS_SCHEDULERパッケージやDBMS …

oracle
[Oracle]CSALTERを使用してOracle Expressのキャラクタセットを変更する

Oracle Expressでは標準のキャラクタセットとしてAL32UTF8が設定されます。 キャラクタセットを意識しないでデータベースの移行やデータベース間の …