ヘッダーをスキップ
Oracle® Databaseプラットフォーム・ガイド
11gリリース2(11.2) for Microsoft Windows
B58885-08
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

16 Windows用アプリケーションの開発

この章では、Windows用アプリケーションの開発に関する情報の参照先を示し、外部プロシージャの作成およびデバッグ手順を説明します。

この章の項目は次のとおりです。

Windows用アプリケーション開発に関する情報の参照先

この項では、Windows用のアプリケーション開発に関する情報の参照先を記載します。これらの製品は、Oracle Databaseサーバーのメディアに含まれています。

Java拡張機能

Oracle Databaseには、Java Virtual MachineおよびJIT Compilerが統合されています。また、Oracle Databaseでは、Oracle Java Database Connectivity(JDBC)ドライバも提供しています。詳細は、『Oracle Database Java開発者ガイド』および『Oracle Database JDBC開発者ガイド』を参照してください。

ODP.NET

Oracle Data Provider for .NET(ODP.NET)は、Oracle Database用のデータ・プロバイダの実装です。ODP.NETにより、Oracle固有のAPIを使用して、任意の.NETアプリケーションからOracleのデータおよび機能に迅速かつ信頼性の高い方法でアクセスできます。また、ODP.NETでは、Microsoft .NET Frameworkクラス・ライブラリで利用可能なクラスとインタフェースが使用および継承されます。詳細は、『Oracle Data Provider for .NET開発者ガイド』およびMy Oracle SupportのNote 726240.1を参照してください。

Oracle Developer Tools for Visual Studio

Oracle Developer Tools for Visual Studio(ODT)は、Microsoft Visual Studio 2008、2005および2003用に緊密に統合されたアドインです。ODTがVisual Studioに統合されるため、視覚的に統合されたデザイナを使用してOracleスキーマ・オブジェクトを簡単に参照したり編集したりでき、また単にドラッグ・アンド・ドロップするだけで.NETコードを自動的に生成できます。開発者は、表データの変更、Oracle SQL文の実行、PL/SQLコードの編集とデバッグ、SQLスクリプトの生成と編集、および.NETストアド・プロシージャの開発とデプロイを行うことができます。これらのツールには他にも様々な機能が用意されています。詳細は、次の場所にあるODT Webホームにアクセスしてください。

http://www.oracle.com/technetwork/developer-tools/visual-studio/overview/index-097110.html

Oracle Providers for ASP.NET

.NET Framework 2.0から、ASP.NETにはデータベースに状態を格納するサービス・プロバイダが含まれています。この状態をデータベースに格納することで、アプリケーションはデータの高可用性を確保すると同時に、すべてのWebサーバーでデータを平等に利用できるようにします。詳細は、『Oracle Providers for ASP.NET開発者ガイド』を参照してください。

XMLサポート

Oracle XML製品には、XML Developer's Kit(XDK)およびOracle XML SQL Utilityが含まれます。詳細は、次を参照してください。

  • 『Oracle XML Developer's Kitプログラマーズ・ガイド』

  • 『Oracle XML DB開発者ガイド』

  • 『Oracle Database XML Java API Reference』

  • 『Oracle Database XML C APIリファレンス』

  • 『Oracle Database XML C++ APIリファレンス』

  • 『Oracle Database SQL言語リファレンス』

  • 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

インターネット・アプリケーションのサポート

Oracle Databaseがサポートするインターネット・アプリケーションとしては、Oracle Portal(データをWebに公開するアプリケーション)、Oracle HTTP Server、PL/SQL組み込み式のゲートウェイ(Oracle Databaseに格納されているPL/SQLプロシージャをブラウザから起動できるようにするアプリケーション)があります。詳細は、次を参照してください。

  • 『Oracle Portal Installation Guide and Tutorial』

  • 『Oracle Enterprise Manager Grid Controlインストレーションおよび基本構成』


    注意:

    Oracle Portalは、別のメディアから入手可能であり、Oracle Database for Windowsに含まれています。

    Oracle Databaseには、最大のPHP、Ruby、Python WebおよびRich Internet Applicationsの要件に対応する組込みのメカニズムが用意されています。非標準接続、スケーラビリティ、キャッシュ、負担のかからないパフォーマンス・アクセラレーション、高度なセキュリティ、高可用性などの機能があります。

Oracle Services for Microsoft Transaction Server

Oracle Database for Windowsでは、Oracle Databaseをリソース・マネージャとして使用して、Microsoft Transaction ServerへのCOM/COM+コンポーネントのデプロイを改善できます。詳細は、『Oracle Services for Microsoft Transaction Server開発者ガイド』を参照してください。

Oracle Objects for OLE

Oracle Objects for OLE(OO4O)では、Microsoft COM AutomationおよびActiveXテクノロジをサポートするプログラミング言語またはスクリプト言語により、Oracle Databaseサーバーに格納されているデータに簡単にアクセスできます。これらの言語には、Visual Basic、Visual C++、Visual Basic For Applications(VBA)、IIS Active Server Pages(VBScriptおよびJavaScript)などがあります。詳細は、『Oracle Objects for OLE開発者ガイド for Microsoft Windows』を参照してください。

Oracle Provider for OLE DB

OLE DBの詳細は、『Oracle Provider for OLE DB開発者ガイド』を参照してください。

Oracle ODBC Driver

Open Database Connectivity (ODBC)は、データベース管理システムからデータにアクセスするアプリケーションの共通Cプログラミング・インタフェースを提供します。データベースへのアクセスはODBCドライバ・マネージャにより管理されます。ドライバ・マネージャは、特定のデータベース管理システムに対し、ODBCアプリケーションとODBCドライバ間のリンケージを提供します。

Oracle ODBC Driverにより、ODBCインタフェースを使用して作成されたアプリケーションはOracleデータベースへアクセスできます。

Oracle Technology Networkには、Oracleホーム・ベースのODBCドライバとInstant Client対応のODBCドライバの両方が用意されています。


注意:

Instant Client対応ODBCドライバを次のサイトからダウンロードします。

http://www.oracle.com/technetwork/database/features/instant-client/index.html



注意:

Oracle ODBCドライバは定期的に更新されます。使用可能な最新のリリースはメディアに収録されています。最新リリースをダウンロードするには、http://www.oracle.com/technology/index.htmlにアクセスしてください。

「テクノロジ/ユーティリティ/ドライバ」リストから「Oracle ODBC Driver」を選択します。


Oracle COM Automation機能

Oracle COM Automation機能により、PL/SQLおよびJavaストアド・プロシージャ開発者とCOM/COM+開発者は、Oracle DatabaseからCOM/COM+オブジェクトをロードできます。詳細は、『Oracle COM Automation機能開発者ガイド』を参照してください。

Pro*C/C++およびPro*COBOLアプリケーション

Pro*C/C++およびPro*COBOLアプリケーションの詳細は、次のマニュアルを参照してください。

  • 『Pro*C/C++プログラマーズ・ガイド』

  • 『Pro*COBOLプログラマーズ・ガイド』

  • 『Oracle Call Interfaceプログラマーズ・ガイド』

外部プロシージャの構築

この項では、Windowsで外部プロシージャを作成および使用する方法を説明します。次のファイルは、ORACLE_HOME\rdbms\extprocにあります。

外部プロシージャの概要

外部プロシージャは、第3世代言語(Cなど)で記述されたファンクションで、PL/SQLルーチンまたはファンクションと同様に、PL/SQLまたはSQL内からコールできます。外部プロシージャを使用すると、第3世代プログラミング言語の長所と機能をPL/SQLの環境内で利用できます。


注意:

Oracle Databaseでは、特殊なインタフェースであるコール仕様も提供しています。これにより、Cからコール可能な外部プロシージャを他の言語からコールできます。

外部プロシージャの主な利点は次のとおりです。

  • パフォーマンス。PL/SQLはSQLトランザクションの処理に向いているため、タスクによってはPL/SQLよりも第3世代プログラミング言語の方が効率的に行うことができます。

  • コードの再利用性。Dynamic Link Library(DLL)をサーバーまたはクライアント・ツールのPL/SQLプログラムから直接コールできます。

外部プロシージャを使用して、特定の処理を行えます。

  • 科学的問題や工学的問題の解決

  • データの分析

  • デバイスやプロセスのリアルタイム制御


注意:

外部プロシージャを処理するようにリスナーを構成する場合には、セキュリティ上の特別な予防手段が保証されます。詳細は、「高度なセキュリティのための外部プロシージャ構成の変更」および『Oracle Database Net Services管理者ガイド』を参照してください。

外部プロシージャを作成して使用するには、次の処理を行う必要があります。

インストールおよび構成

この項では、Oracle DatabaseとOracle Netのインストールおよび構成について説明します。

Oracle Databaseのインストール

Windowsサーバーで次の製品をインストールするには、『Oracle Databaseインストレーション・ガイドfor Microsoft Windows』の手順に従います。

  • Oracle Database Enterprise Edition、Oracle Database Standard EditionまたはOracle Database Personal Edition。それぞれに、外部プロシージャからコールされるPL/SQLおよび外部プロシージャを実行するPL/SQL外部プロシージャ・プログラム(EXTPROC)が含まれています。

  • Oracle Net Services

  • Oracle Protocol Support

Oracle Net Servicesの構成

データベース・サーバーのインストール時に、Oracle Net Configuration Assistantでは、外部プロシージャ・コール用のlistener.oraおよびtnsnames.oraファイルが構成されます。

アプリケーションから外部プロシージャがコールされると、Oracle Net Listenerによって、EXTPROCという外部プロシージャ・エージェントが起動されます。リスナーによって確立されたネットワーク接続を使用して、アプリケーションからEXTPROCに次の情報が渡されます。

  • DLL名

  • 外部プロシージャ名

  • パラメータ(必要な場合)

次に、EXTPROCによってDLLがロードされ、外部プロシージャが実行されて、外部プロシージャから返された値が渡されます。

デフォルトのlistener.oraおよびtnsnames.oraファイルを上書きした場合は、次のファイルを手動で構成して、前述の外部プロシージャが起動するようにします。

  • ORACLE_HOME\network\admin\listener.ora

  • ORACLE_HOME\network\admin\tnsnames.ora


    注意:

    本番環境では、リスナーに追加セキュリティが必要な場合があります。詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。

外部プロシージャの作成

第3世代プログラミング言語を使用して、作成したファンクションをDLLに組み込み、EXTPROCによって起動することができます。次のコードは、Microsoft Visual C++で記述したFIND_MAXという外部プロシージャの簡単な例です。


注意:

外部プロシージャは、DLLに組み込まれるため、明示的にエクスポートする必要があります。この例では、DLLEXPORTという記憶域のクラス修飾子によって、ファンクションFIND_MAXをDynamic Link Libraryからエクスポートします。

#include <windows.h>
#define NullValue -1
/*
  This function tests if x is at least as big as y.
*/
long __declspec(dllexport) find_max(long   x, 
                                short   x_indicator, 
long    y, 
short y_indicator, 
                                short *ret_indicator)
{
   /* It can be tricky to debug DLL's that are being called by a process
      that is spawned only when needed, as in this case.  
      Therefore try using the DebugBreak(); command.  
      This will start your debugger.  Uncomment the line with DebugBreak(); 
      in it and you can step right into your code.
   */
   /* DebugBreak();  */

   /* First check to see if you have any nulls. */
   /* Just return a null if either x or y is null. */

   if ( x_indicator==NullValue || y_indicator==NullValue) {
      *ret_indicator = NullValue;   
      return(0);
   } else { 
      *ret_indicator = 0;       /* Signify that return value is not null. */
      if (x >= y) return x;
      else return y;
   }
}

DLLのビルド

第3世代プログラミング言語で外部プロシージャを記述したら、該当するコンパイラとリンカーを使用してDLLをビルドして、前述したように外部プロシージャをエクスポートするようにしてください。DLLのビルドとDLLの関数エクスポートに関する説明については、コンパイラおよびリンカーのマニュアルを参照してください。

ORACLE_HOME\rdbms\extprocに移動し、makeと入力すると、「外部プロシージャの作成」で作成した外部プロシージャFIND_MAXextern.dllというDLLに組み込むことができます。DLLをビルドした後は、システム内の任意のディレクトリに移動できます。

ただし、Oracle9i リリース2からは、EXTPROCのデフォルトの動作では、DLLはORACLE_HOME\binまたはORACLE_HOME\libからのみロードされます。他のディレクトリからDLLをロードするには、環境変数EXTPROC_DLLSを、完全パスで修飾されたDLL名をコロン(:)で区切ったリストに設定する必要があります。この環境変数を設定する優先方法は、listener.oraENVSパラメータを使用する方法です。


関連項目:

EXTPROCの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照

外部プロシージャの登録

外部プロシージャを含むDLLをビルドした後は、外部プロシージャをOracle Databaseに登録する必要があります。

DLLにマップするためのPL/SQLライブラリを作成するには、次のようにします。

  1. listener.oraENVSパラメータに環境変数EXTPROC_DLLSを設定します。次に例を示します。

    SID_LIST_LISTENER =
     (SID_LIST =
      (SID_DESC =
       (SID_NAME=PLSExtProc)
       (ENVS=EXTPROC_DLLS=C:\app\oracle\product\11.2.0\dbhome_1\rdbms\extproc\extern.dll)
       (ORACLE_HOME=C:\app\oracle\product\11.2.0\dbhome_1)
       (PROGRAM=extproc)
      )
     )
    
  2. SQL*Plusを起動します。

    C:\> sqlplus
    
  3. 適切なユーザー名およびパスワードを入力してデータベースに接続します。

  4. CREATE LIBRARYコマンドでPL/SQLライブラリを作成します。

    SQL> CREATE LIBRARY externProcedures AS 'C:\app\oracle\product\11.2.0\dbhome_1\rdbms\ extproc\extern.dll';
    

    externProceduresは、別名のライブラリ(実際にはデータベースのスキーマ・オブジェクト)です。

    C:\app\oracle\product\11.2.0\dbhome_1\rdbms\extproc\extern.dll
    

    これは、Windowsオペレーティング・システムのdllextern.dllへのパスです。この例では、OracleベースとしてC:\app\oracle\product\11.2.0を、Oracleホームとしてdbhome_1を使用しています。


    注意:

    PL/SQLまたはSQLからPL/SQLライブラリの外部プロシージャをコールする必要のあるユーザーに対して、DBAは、PL/SQLライブラリへのEXECUTE権限を付与する必要があります。

  5. PL/SQLプログラム・ユニットの仕様部を作成します。

    宣言部およびBEGIN...ENDブロックのかわりにEXTERNAL句を使用するPL/SQLサブプログラムを記述します。EXTERNAL句は、PL/SQLと外部プロシージャの間のインタフェースです。EXTERNAL句は、外部プロシージャに関する次の情報を示します。

    • 名前

    • DLLの別名

    • 使用したプログラム言語

    • コール標準(省略した場合は、デフォルトのCが使用される)

    次の例では、externProceduresはDLLの別名です。このライブラリに対するEXECUTE権限が必要です。コールする外部プロシージャはfind_maxです。二重引用符で囲まれている場合、大文字と小文字は区別されます。LANGUAGEでは、外部プロシージャを作成した言語を指定します。

    CREATE OR REPLACE FUNCTION PLS_MAX(
      x BINARY_INTEGER,
      y BINARY_INTEGER)
    RETURN BINARY_INTEGER AS
      EXTERNAL LIBRARY externProcedures
      NAME "find_max"
      LANGUAGE C
      PARAMETERS (
        x long,                  -- stores value of x
        x_INDICATOR short,       -- used to determine if x is a NULL value
        y long,                  -- stores value of y
        y_INDICATOR short,        -- used to determine if y is a NULL value
      RETURN INDICATOR short );  -- need to pass pointer to return value's
                                 -- indicator variable to determine if NULL
    -- This means that my function will be defined as:
        -- long max(long x, short x_indicator,
        -- long y, short y_indicator, short * ret_indicator)
    

ライブラリ関連の権限を信頼できるユーザーのみに制限する

CREATE LIBRARYCREATE ANY LIBRARYALTER ANY LIBRARYおよびEXECUTE ANY LIBRARY権限と、EXECUTE ON library_nameの付与によって、ユーザーに大きな力が与えられます。ライブラリへのPL/SQLインタフェースを作成する場合は、PL/SQLインタフェースにEXECUTE権限を付与するのみにしてください。基礎となるライブラリにはEXECUTEを付与しないでください。ライブラリへのPL/SQLインタフェースを作成するためには、ライブラリに対するEXECUTE権限が必要です。しかしユーザーは、自分自身のスキーマで作成するライブラリに対して暗黙的にこの権限を持っています。EXECUTE ON library_nameの明示的付与が必要になることはほとんどありません。これらの権限は信頼できるユーザーにのみ明示的に付与し、決してPUBLICロールには付与しないでください。

外部プロシージャの実行

外部プロシージャを実行するには、外部プロシージャを登録したPL/SQLプログラム・ユニット(外部ファンクションの別名)をコールする必要があります。これらのコールは、次のいずれにも含めることができます。

  • 無名ブロック

  • スタンドアロンおよびパッケージ・サブプログラム

  • オブジェクト型のメソッド

  • データベース・トリガー

  • SQL文(パッケージ・ファンクションのコールでのみ可能)

「外部プロシージャの登録」で、PL/SQL関数PLS_MAXを使用して、外部プロシージャfind_maxを登録しています。次の手順に従って、find_maxを実行します。

  1. PL/SQLファンクションPLS_MAXUseItというPL/SQLプロシージャでコールします。

    SET SERVER OUTPUT ON
    CREATE OR REPLACE PROCEDURE UseIt AS
                    a integer;
                    b integer;
                    c integer;
    BEGIN
                    a := 1;
                    b := 2;
                    c := PLS_MAX(a,b);
                    dbms_output.put_line('The maximum of '||a||' and '||b||' is  '||c);
    END;
    
  2. ルーチンを実行します。

    SQL> EXECUTE UseIt;
    

マルチスレッド・エージェント・アーキテクチャ

システムに同時にアクセスするセッションがある場合、エージェント・プロセスはセッションごとに起動されるため、数千のエージェント・プロセスが同時に実行される結果になります。エージェント・プロセスは、その時点で個々のエージェント・プロセスが実際にアクティブかどうかを考慮せず動作します。しかし、エージェント・プロセスとオープン接続のシステム・リソース消費量はつりあっていない場合があります。この問題に対処するために、マルチスレッド・エージェント・アーキテクチャが提供されています。

マルチスレッド・エージェント・アーキテクチャでは、共有されるエージェント・スレッドのプールが使用されます。ユーザー・セッションによって要求されたタスクはキューに入れられ、最初に利用可能なマルチスレッドのエージェント・スレッドによって取得されます。ユーザー接続のうち、特定の時点でアクティブになっているものはごく一部なので、マルチスレッド・アーキテクチャを使用することにより、システム・リソースがより効率的に使用されるようになります。


関連項目:

  • 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』の第III部

  • 『Oracle Database Heterogeneous Connectivityユーザーズ・ガイド』のマルチスレッド・エージェントに関する項


外部プロシージャのデバッグ

通常、外部プロシージャが失敗する場合は、Cプロトタイプに問題があります。つまり、プロトタイプがPL/SQLによって内部で生成されるプロトタイプと一致していません。この問題は、互換性のないCデータ型を指定した場合に発生することがあります。たとえば、データ型がREALOUTパラメータを渡すには、float *を指定する必要があります。floatdouble *または他のCデータ型を指定すると、データ型は一致しません。

このような場合は、「外部プロシージャ・エージェントへのRPC接続が失われました。」エラーが発生する可能性があります。これは、外部プロシージャでコア・ダンプが発生したため、エージェントextprocが異常終了したことを意味します。Cプロトタイプ・パラメータを宣言する際にエラーの発生を回避するには、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

パッケージDEBUG_EXTPROCの使用

外部プロシージャのデバッグに役立つように、PL/SQLにはユーティリティ・パッケージDEBUG_EXTPROCが用意されています。このパッケージをインストールするには、PL/SQLデモ・ディレクトリにあるスクリプトdbgextp.sqlを実行します。

パッケージを使用するには、dbgextp.sqlの手順に従います。Oracle Databaseアカウントには、パッケージに対するEXECUTE権限およびCREATE LIBRARY権限が必要です。

外部プロシージャをデバッグするには、次のようにします。

  1. Windowsのタスク マネージャの「プロセス」ダイアログ・ボックスでExtProc.exeを選択します。

  2. 右クリックして、「デバッグ」を選択します。

  3. メッセージ・ウィンドウで「OK」をクリックします。

    Microsoft Visual C++のデバッグ方式でDLLをビルドした場合は、Visual C++が起動します。

  4. Visual C++ウィンドウで、「編集」「ブレークポイント」を選択します。

    PL/SQLデモ・ディレクトリのdbgextp.sqlで示されたブレーク・ポイントを使用します。


    関連項目:

    • ORACLE_HOME\rdbms\extproc\readme.doc(サンプルの実行方法の説明およびデバッグのアドバイスが含まれます)

    • 『Oracle Database PL/SQL言語リファレンス』

    • 『Oracle Database Java開発者ガイド』

    • 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』の「外部プロシージャのコール」

    • 『Oracle Databaseデータ・カートリッジ開発者ガイド』


UTL_FILEでのテキスト・ファイルへのアクセス

UTL_FILEパッケージを使用すると、PL/SQLプログラムでオペレーティング・システムのテキスト・ファイルの読込みと書込みができます。これは機能的に限定されており、オペレーティング・システムの標準のストリーム・ファイルI/O操作のうち、オープン、書込み、読込みおよびクローズ操作のみを使用できます。テキスト・ファイルの読込みまたは書込みを行う場合は、関数fopenをコールします。この関数は後続のプロシージャ・コールで使用するためのファイル・ハンドルを返します。たとえば、プロシージャput_lineは、開いているファイルにテキスト文字列と行の終了文字を書き込み、プロシージャget_lineは、開いているファイルから出力バッファに1行分のテキストを読み込みます。


関連項目:

UTL_FILEの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照

FSEEKUTL_FILEサブプログラムは、ファイル内のファイル・ポインタを指定されたバイト数だけ前方または後方に調整します。UTL_FILE.FSEEKが正しく動作するためには、ファイル内の行にプラットフォーム固有の行終端文字が必要です。Windowsプラットフォームでは、適切な行終端文字は<CR><LF>です。

Intercartridge Exchangeを使用したWebデータへのアクセス

この項の項目は次のとおりです。

Intercartridge Exchangeの構成

Intercartridge Exchangeを使用する前に、レジストリにパラメータを追加する必要があります。

  1. コマンド・プロンプトから、レジストリ エディタを起動します。

    C:\> regedit
    

    「レジストリ エディタ」ウィンドウが表示されます。


    注意:

    レジストリを構成する他の方法については、「regeditによるレジストリ・パラメータの管理」を参照してください。

  2. 使用しているOracleホーム・ディレクトリのレジストリのサブキーに、HTTP_PROXYを追加します。このパラメータの位置は、コンピュータにOracleホーム・ディレクトリがいくつあるかによって決まります。ホーム・ディレクトリが1つしかない場合は、次の位置にHTTP_PROXYを追加します。

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0. 
    

    複数のホーム・ディレクトリがある場合は、次の位置に追加します。

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOME_NAME 
    
  3. 「編集」メニューから「値の追加」を選択します。

    「値の追加」ダイアログが表示されます。

    http.gifの説明が続きます
    図http.gifの説明

  4. 「値の名前」フィールドにHTTP_PROXYと入力し、「データ型」フィールドにREG_SZと入力します。

  5. 「OK」をクリックします。

  6. 「文字列」フィールドにwww-proxy.your-siteを入力します。

    http2.gifの説明が続きます
    図http2.gifの説明

この例では、Webサイトはmarketing.comです。実際のWebサイトのドメイン名を入力します。

Intercartridge Exchangeの使用

Intercartridge Exchangeでは、UTL_HTTPというストアド・パッケージを使用して、PL/SQL、SQLおよびSQL*Plus文から、Hypertext Transfer Protocol(HTTP)をコールできます。

UTL_HTTPを使用すると、次の処理を両方実行できます。

  • インターネット上のデータへのアクセス

  • Oracle Webアプリケーション・サーバー・カートリッジのコール

UTL_HTTPには、パッケージ・ファンクションという2つの類似したエントリ・ポイントが含まれます。パッケージ・ファンクションは、PL/SQL文とSQL文からHTTPコールを行います。

  • UTL_HTTP.REQUEST

  • UTL_HTTP.REQUEST_PIECES

両方のパッケージ・ファンクションは、次のタスクを実行します。

  • サイトのUniform Resource Locator(URL)文字列の取得

  • サイトへの接続

  • サイトから取得したデータ(通常はHTML)の戻し

両方のパッケージ・ファンクションで使用する宣言部は、次の各項で示します。

パッケージ・ファンクションUTL_HTTP.REQUEST

UTL_HTTP.REQUESTはURLを引数として使用し、そのURLから取得した最初の2000バイトのデータを返します。UTL_HTTP.REQUESTを次のように指定します。

FUNCTION REQUEST (URL IN VARCHAR2) RETURN VARCHAR2;

SQL*PlusでUTL_HTTP.REQUESTを使用する場合は、次の文を入力します。

SQL> SELECT UTL_HTTP.REQUEST('HTTP://WWW.ORACLE.COM/') FROM DUAL;

戻り値は次のようになります。

UTL_HTTP.REQUEST('HTTP://WWW.ORACLE.COM/')                         
        ------------------------------------------------------
<html>
<head><title>Oracle Home Page</title>
<!--changed Jan. 16, 19
1 row selected.

パッケージ・ファンクションUTL_HTTP.REQUEST_PIECES

UTL_HTTP.REQUEST_PIECESはURLを引数として使用し、そのURLから取得した2000バイトのデータのPL/SQL表を返します。最後の要素は、2000文字よりも短い場合があります。UTL_HTTP.REQUEST_PIECESの戻り型は、UTL_HTTP.HTML_PIECES型のPL/SQL表です。

UTL_HTTP.HTML_PIECES型のUTL_HTTP.REQUEST_PIECESは、次のように指定します。

type html_pieces is table of varchar2(2000) index by binary_integer;
function request_pieces (url in varchar2,
  max_pieces natural default 32767)
return html_pieces;

REQUEST_PIECESへのコールは、この例のようになります。PL/SQL表のメソッドCOUNTを使用して要素数を検出する場合、そのメソッドから返される値はゼロ以上です。

declare pieces utl_http.html_pieces;
begin 
  pieces := utl_http.request_pieces('http://www.oracle.com/'); 
   for i in 1 .. pieces.count loop
     .... -- process each piece
   end loop;
end;

UTL_HTTP.REQUEST_PIECESの第2引数(MAX_PIECES)は、オプションとして指定できます。MAX_PIECESは、UTL_HTTP.REQUEST_PIECESが返す要素の最大数です(それぞれ2000文字ですが、最後の要素は2000文字未満の場合があります)。引数はほとんどの場合、正の整数です。

たとえば、次のブロックでは、最高100個の要素(各要素は2000バイト、最後の要素はそれ未満の場合があります)をURLから取得します。ブロックでは、取得された要素の数、取得されたデータ全体の長さ(バイト数)が出力されます。

set serveroutput on

declare 
  x utl_http.html_pieces;
begin
  x := utl_http.request_pieces('http://www.oracle.com/', 100);
  dbms_output.put_line(x.count || ' pieces were retrieved.');
  dbms_output.put_line('with total length ');
  if x.count < 1 
  then dbms_output.put_line('0');
  else dbms_output.put_line
((2000 * (x.count - 1)) + length(x(x.count)));
  end if;
end;

which displays:
Statement processed.
4 pieces were retrieved.
with total length 
7687

UTL_HTTP.REQUEST_PIECESによって返されるPL/SQL表の要素は、そのURLへのHTTPリクエストから取得される、連続するデータです。

UTL_HTTP例外条件

この項では、パッケージ・ファンクションUTL_HTTP.REQUESTおよびUTL_HTTP.REQUEST_PIECESで発生する可能性のある例外(エラー)について説明します。

UTL_HTTP.REQUEST

PRAGMA RESTRICT_REFERENCESを使用すると、例外を表示できます。

create or replace package utl_http is
function request (url in varchar2) return varchar2;
pragma restrict_references (request, wnds, rnds, wnps, rnps);

UTL_HTTP.REQUEST_PIECES

PRAGMA RESTRICT_REFERENCESを使用すると、例外を表示できます。

create or replace package utl_http is
type html_pieces is table of varchar2(2000) index by binary_integer;
function request_pieces (url in varchar2, 
   max_pieces natural default 32767)
return html_pieces;
pragma restrict_references (request_pieces, wnds, rnds, wnps, rnps);

例外条件およびエラー・メッセージ

環境上の原因(使用可能なメモリーの不足など)により、HTTPコールアウト・サブシステムの初期化に失敗すると、例外UTL_HTTP.INIT_FAILEDが発生します。

init_failed exception;

HTTPデーモンに障害が発生したか、あるいはREQUESTまたはREQUEST_PIECESに対する引数がURLとして解釈されない(引数がNULLかまたはHTTPの構文でないため)ために、HTTPコールが失敗した場合は、次の例外UTL_HTTP.REQUEST_FAILEDが発生します。

request_failed exception;

この2つの例外は、このシステム・パッケージで定義されていますが、例外ハンドラによって明示的に捕捉されないかぎり、ユーザー定義の例外として汎用メッセージによって報告されます。

ORA-06510: PL/SQL: unhandled user-defined exception

メモリーの不足などにより、HTTPリクエスト処理中にその他の例外状況が発生すると、UTL_HTTP.REQUESTまたはUTL_HTTP.REQUEST_PIECESでこの例外が再度発生します。

指定したURLに対応するサイトにファンクションが接続しなかったためURLへの要求から応答が得られない場合、HTML形式のエラー・メッセージが返されることがあります。

<HTML>
<HEAD>
<TITLE>Error Message</TITLE>
</HEAD>
<BODY>
<H1>Fatal Error 500</H1>
Can't Access Document: http://home.nothing.comm.
<P>
<B>Reason:</B> Can't locate remote host:  home.nothing.comm.
<P>
<P><HR>
<ADDRESS><A HREF="http://www.w3.org">
CERN-HTTPD3.0A</A></ADDRESS>
</BODY>
</HTML>

UTL_HTTP.REQUESTまたはUTL_HTTP.REQUEST_PIECESによって、例外が発生する場合、またはHTML形式のエラー・メッセージが返されるが、URLの引数が正しい場合は、ブラウザを使用して同じURLへの接続を試み、コンピュータからネットワークに接続できるかどうかを確認してください。