e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第87回 「PL/SQLからWEBページにアクセスする」

2014.02.20

こんにちは。インストラクターの蓑島です。
大雪が降ったり、寒い日が続いたりしますね。早く春になってもらいたいものです。

さて、今回と次回でPL/SQLでインターネットのWEBページにアクセスする簡単な方法をご紹介したいと思います。
今回は基本的な説明として、アクセス可能とするための準備および簡単なフェッチができることの確認をします。
次回はその応用例として、WEBページに対して検索を行う簡単なプログラミングをする予定です。
外部ネットワークへのアクセスはPL/SQLの本来の機能ではありませんが、オラクルデータベースに用意されているパッケージを使えば可能です。

そういったデータベース外部のネットワークにアクセスできるパッケージはいくつかあるのですが、今回はUTL_HTTPパッケージを使いたいと思います。とても簡単です。

実はOracle 11gからセキュリティが強化されました。
パッケージから外部ネットワークサービスにアクセスするためには、「アクセス制御リスト」(以下、ACL)を作成し、そのACLに対する権限をユーザ(またはロール)に付与し、そのACLをアクセスしたいネットワーク・ホストにアサインする必要があります。これはUTL_HTTPパッケージに限らず、他のパッケージでも同じです。
さらに、httpでなく、「https」でアクセスする場合は、証明書のため「Oracle Wallet」の設定が必要ですが、今回は「http」プロトコルに限定としたいと思います。
詳細を調べたい方は、マニュアル「PL/SQLパッケージおよびタイプ・リファレンス」や「セキュリティガイド」を参照してください。

それでは早速始めましょう。
事前準備としてACLの作成、権限の付与、ネットワークホストのアサインを行います。
具体的なストーリとしては、SCOTTユーザが、「www.yahoo.co.jp」と「www.istudy.ne.jp」にアクセス可能となるように設定します。DBMS_NETWORK_ACL_ADMINパッケージを使用します。

ではそのためには管理者ユーザー(SYSなど)でログインしてください。

1
2
SQL> SHOW USER
ユーザーは "SYS" です。

次に、SCOTTユーザに権限を与える形で、ACLを作成します。以下のように行います。

1
2
3
4
5
6
7
8
9
10
11
BEGIN
   DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
    acl          => 'scott-permission.xml' ,
    description  => 'acl for scott user' ,
    principal    => 'SCOTT' ,
    is_grant     => TRUE ,
    privilege    => 'connect' );
END ;
/
 
PL/SQLプロシージャが正常に完了しました。

これでACLが作成されました。パラメータの意味は以下のとおりです。

  • 「acl」はACLの名前です。
  • 「description」はACLの簡単な説明文です。
  • 「pricipal」は権限を付与するユーザ名またはロール名です。ユーザ名、ロール名は大文字小文字を区別します。ディクショナリ上、通常は大文字なので、大文字で指定します。今回はユーザ名としてSCOTTを指定しました。
  • 「is_grant」は権限を付与する場合はTRUEです。
  • 「privilege」 は権限の種類です。値は「connect」か「resolve」のどちらかです。今回のケースにおいてはconnectです。

次にネットワークホスト「www.yahoo.co.jp」と「www.istudy.ne.jp」をこのACLにアサインします。
以下のように行います。

1
2
3
4
5
6
7
8
9
10
BEGIN
   DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => 'scott-permission.xml' ,
                                     host => 'www.yahoo.co.jp' );
   DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => 'scott-permission.xml' ,
                                     host => 'www.istudy.ne.jp' );
   COMMIT ;
END ;
/
 
PL/SQLプロシージャが正常に完了しました。

これで、SCOTTユーザは、ネットワークホスト「www.yahoo.co.jp」と「www.istudy.ne.jp」にPL/SQLのパッケージを通してアクセスできるようになりました。
早速、SCOTTユーザでログインします。

1
2
3
4
SQL> CONNECT SCOTT/tiger
接続されました。
SQL> show user
ユーザーは "SCOTT" です。

では、簡単なHTTPのフェッチをしてみます。PL/SQLではなく単純なSELECT文で可能です。以下の例をご覧ください。

1

ここでは、「SELECT UTL_HTTP.REQUEST('http://www.istudy.ne.jp/training/serial/plsql/') FROM DUAL;」という問い合わせをしているのですが、該当ページの先頭の2000バイトが返ってきます。

ご覧のようにこの問い合わせは、「~FROM DUAL」なので表やビューを問い合わせているわけではありません。
ファンクションコールUTL_HTTP.REQUEST('http://www.istudy.ne.jp/training/serial/plsql/')を問い合わせているわけです。

ここで、「REQUEST」はUTL_HTTPパッケージ内のファンクションですが、リターンするデータ型はVARCHAR2です。指定したURLの先頭2000バイトまでを返す仕様となっています。ちなみにここで指定しているURL(http://www.istudy.ne.jp/training/serial/plsql/)はACLにアサインした「www.isuty.ne.jp」に該当するのでアクセスできるわけです。なお、このURLは本メルマガ「PL/SQLをつかってみよう」のトップページです。そのトップページの先頭2000バイトのHTMLドキュメントをそのまま問い合わせたわけです。

いかがですがか?上記のコードをコピペしてSQL*Plusなどで実行すれば簡単ですね。

作成したACLについての情報を確認する場合は以下のビューを問い合わせてください。
DBA_NETWORK_ACLS
DBA_NETWORK_ACL_PRIVILEGES

またACLを削除して元の状態にしたい方は管理者ユーザ(SYSユーザなど)で以下のようにしてください。

1
2
3
4
5
6
7
BEGIN
   DBMS_NETWORK_ACL_ADMIN.DROP_ACL( 'scott-permission.xml' );
   COMMIT -- 必要です
END ;
/
 
PL/SQLプロシージャが正常に完了しました。

これで、ACLが削除されましたので、もとの状態となりました。
SCOTTユーザは該当のWEBページにアクセスできません。

今回はPL/SQLのプログラミングということではなく、WEBページにアクセス可能とするまでのACLの設定を中心に解説しました。
次回は、PL/SQLを使って、先頭2000バイトだけでなく、すべてのデータを取得し、それを使ってWEBページ内の文字列検索をおこなうような簡単なプログラミングを行いたいと思います。
ぜひご期待ください!

先頭へ戻る