ヘッダーをスキップ

Oracle Databaseプラットフォーム・ガイド 11gリリース1（11.1） for Microsoft Windows E05885-05 |
| 目次 | 索引

戻る | 次へ |

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

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

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

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

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

- アプリケーションの移行

- 外部プロシージャの構築

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

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

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

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

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

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

### Java拡張機能

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

### 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、Oracle HTTP Server、およびPL/SQL Embedded Gatewayがあります。Oracle PortalはデータのWeb公開を可能にし、PL/SQL Embedded Gatewayは、Oracle Databaseに格納され、ブラウザから起動できるPL/SQLプロシージャを提供します。詳細は、次のマニュアルを参照してください。

- 『Oracle Portal Installation Guide and Tutorial』

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

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

  注意: Oracle Portalは、Oracle Database for Microsoft Windows（x64）ではサポートされません。

### Oracle COM/COM+統合機能

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

### 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開発者ガイド』を参照してください。

注意: Oracle Objects for OLE（OO4O）は、Oracle Database 11gリリース1（11.1）for Windows（64-bit）ではサポートされません。

### 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開発者ガイド』を参照してください。

### Oracle Services for Microsoft Transaction Server

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

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

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

- 『Pro*C/C++スタート・ガイド』

- 『Pro*COBOLスタート・ガイド』

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

### OLE DB

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

注意: Oracle ODBCドライバは定期的に更新されます。最新リリースはOTNで公開されています。最新リリースをダウンロードするには、`http://www.oracle.com/technology/index.html`にアクセスしてください。 「テクノロジ/ユーティリティ/ドライバ」リストから「Oracle ODBC Driver」を選択します。

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

Oracle Databaseでは、Windowsアプリケーション開発者向けに総合的なAPIのセットを提供し、JavaおよびCOM/COM+開発の両方に対応しています。Oracle Databaseは、Windows Distributed interNet Application Architecture（DNA）として知られる、Microsoft社の開発およびデプロイメント・コンポーネントに統合されています。次の点で、Windowsでのパフォーマンスおよびデータ・アクセスが向上します。

- Windowsおよびインターネット・アプリケーションでの広範なデータ・アクセス方法

- 短時間でのアプリケーション開発を可能にするウィザードおよび補助ツール

- Oracle Objects for OLEまたはOracle Provider for OLE DBの2つのAPIによるCOM/COM+/DCOMの統合

- Microsoft Transaction Serverとの統合: Oracle Services for Microsoft Transaction Server

- インターネット・アプリケーション開発のためのプラットフォームの拡張

開発者は新しいデータ・アクセス方法を学ぶ必要はなく、精通したデータ・アクセス方法を使用できるため、データベース・アプリケーションを短期間でデプロイできます。Oracle Databaseサーバーでは、表16-1に示す様々な方法でWindowsクライアントと通信できます。

表16-1 Oracleのデータ・アクセス方法

開発環境 | データ・アクセス方法
--- | ---
Java | JDBC SQLJ
COM/COM+ | Oracle Objects for OLE（OO4O） Oracle Provider for OLE DB COM/COM+ Automation Feature

Oracle Databaseデータ・アクセス・インタフェースを使用することにより、開発者は特定のOracle Database機能を利用できます。これらのインタフェースでは、柔軟性およびオープン規格への準拠も提供されます。

Oracle COM/COM+インタフェースでは、次の機能が提供されます。

- Visual Basic、Visual C++、VBA in Excel、Active Server Pages、PowerBuilder、Delphi、Internet Information Server（IIS）、Microsoft Transaction ServerなどのMicrosoft COM/COM+テクノロジをサポートするあらゆるプログラミング環境から、OO4Oを使用できます。OO4Oは、特にOracle Databaseサーバーとともに使用するために開発されています。

- Oracle Provider for OLE DBでは、ActiveX Data Objects（ADO）開発者に高いパフォーマンスおよびOracle Databaseへの効率的なアクセスを提供します。システム固有のOLE DBプロバイダにより、データ・アクセスが最適化され、Oracle固有のデータベース機能へのアクセスが提供されます。

- PL/SQL開発者は、COM/COM+ Automation Feature APIを使用して、COM/COM+オブジェクトをルーチンに簡単に組み込むことができます。Javaストアド・プロシージャおよびCOM/COM+の開発者は、この機能の拡張機能であるOracle COM/COM+ Integrationを使用して、OLEオートメーションまたはカスタムCOM/COM+インタフェースを介してOracle Database内のCOM/COM+オブジェクトをロードできます。

### インターネット・アプリケーションの開発

Oracle Databaseではインターネット・アプリケーション開発のためのWindows拡張機能を提供します。この機能により、次のようなクライアントからのアクセスが可能になります。

- 任意のブラウザ

- WindowsまたはMacintoshクライアント

- FTPクライアント

- データベース・クライアント

- COM/COM+クライアント

- 電子メール・クライアント

Microsoft Transaction Serverとの統合に加え、Oracle Databaseデータ・アクセス・インタフェースおよび開発ツールを使用して、図16-1「Microsoft Transaction ServerとOracle Databaseの統合」に示すようなインターネット・アプリケーションを作成できます。

図16-1 Microsoft Transaction ServerとOracle Databaseの統合

「図16-1 Microsoft Transaction ServerとOracle Databaseの統合」の説明

## アプリケーションの移行

独自のアプリケーションを作成する場合、Oracleの64ビット・コンポーネントを使用してください。ビジネス・ロジックを移行する場合は、Microsoft Developer Network（MSDN）のWebサイト（`http://msdn.microsoft.com/en-us/default.aspx`）で移行上のヒントを参照してください。

注意: ユーザー表の`NCHAR`列は、移行中に変更されません。ユーザー表の`NCHAR`列を変更する場合は、『Oracle Databaseアップグレード・ガイド』のユーザーNCHAR列のアップグレードに関する項を参照してください。

## 外部プロシージャの構築

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

- `extern.c`は、「外部プロシージャの作成」に示すコードの例です。

- `make.bat`は、Dynamic Link Libraryを構築するバッチ・ファイルです。

- `extern.sql`は、「外部プロシージャの登録」および「外部プロシージャの実行」で説明する手順を自動化します。

### 外部プロシージャの概要

外部プロシージャは、第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管理者ガイド』を参照してください。

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

- インストールおよび構成

- 外部プロシージャの作成

- DLLのビルド

- 外部プロシージャの登録

- 外部プロシージャの実行

  注意: DLLをビルドするには、Cコンパイラおよびリンカーがシステムにインストールされている必要があります。

  注意: 4番目と5番目のタスクの説明にある処理は、外部プロシージャの登録および実行の処理を自動化する、1つのSQLスクリプトにできます。これらの処理を結合したSQLスクリプトの例は、`ORACLE_BASE``\``ORACLE_HOME``\rdbms\extproc\extern.sql`を参照してください。

### インストールおよび構成

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

#### Oracle Databaseのインストール

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

- 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_BASE``\``ORACLE_HOME``\network\admin\listener.ora`

- `ORACLE_BASE``\``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をビルドしてそのファンクションをエクスポートする方法は、該当するコンパイラとリンカーのドキュメントを参照してください。

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

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

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

### 外部プロシージャの登録

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

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

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

       SID_LIST_LISTENER =
        (SID_LIST =
         (SID_DESC =
          (SID_NAME=PLSExtProc)
          (ENVS=EXTPROC_DLLS=C:\oracle\product\11.1.0\db_1\rdbms\extproc\extern.dll)
          (ORACLE_HOME=C:\oracle\product\11.1.0\db_1)
          (PROGRAM=extproc)
         )
        )

2. SQL*Plusを起動します。

       C:\> sqlplus

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

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

       SQL> CREATE LIBRARY externProcedures AS 'C:\oracle\product\11.1.0\db_1\rdbms\ extproc\extern.dll';

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

       C:\oracle\product\11.1.0\db_1\rdbms\extproc\extern.dll

   これは、Windowsオペレーティング・システムの`dllextern.dll`へのパスです。この例では、Oracleベースとして`C:\oracle\product\11.1.0`を、Oracleホームとして`db_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)

### 外部プロシージャの実行

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

- 無名ブロック

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

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

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

- SQL文（パッケージ・ファンクションのコールでのみ可能）

「外部プロシージャの登録」で、PL/SQLファンクション`PLS_MAX`に、外部プロシージャ`find_max`が登録されました。次の手順に従って、`find_max`を実行します。

1. PL/SQLファンクション`PLS_MAX`を`UseIt`という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データ型を指定した場合に発生することがあります。たとえば、データ型が`REAL`の`OUT`パラメータを渡すには、`float` `*`を指定する必要があります。`float`、`double` `*`または他のCデータ型を指定すると、データ型は一致しません。

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

### パッケージDEBUG_EXTPROCの使用

外部プロシージャのデバッグ用に、PL/SQLにはユーティリティ・パッケージDEBUG_EXTPROCが用意されています。パッケージをインストールするには、スクリプト`dbgextp.sql`を実行します。このスクリプトはPL/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_BASE``\``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`は開いたファイルから出力バッファにテキスト行を読み取ります。

関連項目: `UTL_FILE`の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照

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

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

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

- Intercartridge Exchangeの構成

- Intercartridge Exchangeの使用

- UTL_HTTP例外条件

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

### 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の説明

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

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

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

   図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への接続を試み、コンピュータからネットワークに接続できるかどうかを確認してください。