この章では、Windows用アプリケーションの開発に関する情報の参照先を示し、外部プロシージャの作成およびデバッグ手順を説明します。
この章の項目は次のとおりです。
この項では、Windows用のアプリケーション開発に関する情報の参照先を記載します。これらの製品は、Oracle Databaseサーバーのメディアに含まれています。
Oracle Databaseには、Java Virtual MachineおよびJServer Acceleratorが統合されています。また、Oracle Databaseでは、Oracle Java Database Connectivity(JDBC)ドライバも提供しています。詳細は、『Oracle Database Java開発者ガイド』を参照してください。
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+統合機能により、Javaストアド・プロシージャ開発者およびCOM/COM+開発者は、Oracle DatabaseからCOM+オブジェクトをロードできます。詳細は、『Oracle COM Automation機能開発者ガイド』を参照してください。
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)ではサポートされません。 |
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 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スタート・ガイド』
『Oracle Call Interfaceプログラマーズ・ガイド』
OLE DBの詳細は、『Oracle Provider for OLE DB開発者ガイド』を参照してください。
注意: Oracle ODBCドライバは定期的に更新されます。最新リリースはOTNで公開されています。最新リリースをダウンロードするには、http://www.oracle.com/technology/index.html にアクセスしてください。
「テクノロジ/ユーティリティ/ドライバ」リストから「Oracle ODBC Driver」を選択します。 |
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の統合
独自のアプリケーションを作成する場合、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をビルドするには、Cコンパイラおよびリンカーがシステムにインストールされている必要があります。 |
注意: 4番目と5番目のタスクの説明にある処理は、外部プロシージャの登録および実行の処理を自動化する、1つのSQLスクリプトにできます。これらの処理を結合したSQLスクリプトの例は、ORACLE_BASE \ ORACLE_HOME \rdbms\extproc\extern.sql を参照してください。 |
この項では、Oracle DatabaseとOracle Netのインストールおよび構成について説明します。
次の製品をWindowsサーバーにインストールするには、Oracle Databaseのインストレーション・ガイドの手順に従います。
データベース・サーバーのインストール時に、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; } }
第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ライブラリを作成するには、次のようにします。
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) ) )
SQL*Plusを起動します。
C:\> sqlplus
適切なユーザー名およびパスワードを入力してデータベースに接続します。
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
を使用しています。
宣言部および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
を実行します。
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;
ルーチンを実行します。
SQL> EXECUTE UseIt;
システムに同時にアクセスするセッションがある場合、エージェント・プロセスはセッションごとに起動されるため、数千のエージェント・プロセスが同時に実行される結果になります。エージェント・プロセスは、その時点で個々のエージェント・プロセスが実際にアクティブかどうかを考慮せず動作します。しかし、エージェント・プロセスとオープン接続のシステム・リソース消費量はつりあっていない場合があります。この問題に対処するために、マルチスレッド・エージェント・アーキテクチャが提供されています。
マルチスレッド・エージェント・アーキテクチャでは、共有されるエージェント・スレッドのプールが使用されます。ユーザー・セッションによって要求されたタスクはキューに入れられ、最初に利用可能なマルチスレッドのエージェント・スレッドによって取得されます。ユーザー接続のうち、特定の時点でアクティブになっているものはごく一部なので、マルチスレッド・アーキテクチャを使用することにより、システム・リソースがより効率的に使用されるようになります。
関連項目:
|
通常、外部プロシージャが失敗する場合は、Cプロトタイプに問題があります。つまり、プロトタイプがPL/SQLによって内部で生成されるプロトタイプと一致していません。この問題は、互換性のないCデータ型を指定した場合に発生することがあります。たとえば、データ型がREAL
のOUT
パラメータを渡すには、float
*
を指定する必要があります。float
、double
*
または他のCデータ型を指定すると、データ型は一致しません。
このような場合、「外部プロシージャ・エージェントへのRPC接続が失われました。」というエラーが発生します。これは、外部プロシージャによってコア・ダンプが発生したために、エージェントextproc
が異常終了したことを示します。Cプロトタイプ・パラメータを宣言する際にエラーの発生を回避するには、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。
外部プロシージャのデバッグ用に、PL/SQLにはユーティリティ・パッケージDEBUG_EXTPROCが用意されています。パッケージをインストールするには、スクリプトdbgextp.sql
を実行します。このスクリプトはPL/SQLのデモ・ディレクトリにあります。
パッケージを使用するには、dbgextp.sql
の手順に従います。Oracle Databaseアカウントには、パッケージに対するEXECUTE
権限およびCREATE
LIBRARY
権限が必要です。
外部プロシージャをデバッグするには、次のようにします。
Windowsのタスク マネージャの「プロセス」ダイアログ・ボックスでExtProc.exeを選択します。
右クリックして、「デバッグ」を選択します。
メッセージ・ウィンドウで「OK」をクリックします。
Microsoft Visual C++のデバッグ方式でDLLをビルドした場合は、Visual C++が起動します。
Visual C++のウィンドウで、「編集」→「ブレークポイント」を選択します。
PL/SQLデモ・ディレクトリのdbgextp.sql
で示されたブレーク・ポイントを使用します。
関連項目:
|
パッケージ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を使用する前に、レジストリにパラメータを追加する必要があります。
コマンド・プロンプトから、レジストリ エディタを起動します。
C:\> regedit
「レジストリ エディタ」ウィンドウが表示されます。
使用しているOracleホーム・ディレクトリのレジストリのサブキーに、HTTP_PROXY
を追加します。このパラメータの位置は、コンピュータにOracleホーム・ディレクトリがいくつあるかによって決まります。ホーム・ディレクトリが1つしかない場合は、次の位置にHTTP_PROXY
を追加します。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0.
複数のホーム・ディレクトリがある場合は、次の位置に追加します。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_HOME_NAME
「編集」メニューから「値の追加」を選択します。
「値の追加」ダイアログが表示されます。
「値の名前」フィールドにHTTP_PROXY
と入力し、「データ型」フィールドにREG_SZ
と入力します。
「OK」をクリックします。
「文字列」フィールドにwww-proxy.
your-site
を入力します。
この例では、Webサイトはmarketing.com
です。実際のWebサイトのドメイン名を入力します。
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
は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
は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.REQUEST
およびUTL_HTTP.REQUEST_PIECES
で発生する可能性のある例外(エラー)について説明します。
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);
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への接続を試み、コンピュータからネットワークに接続できるかどうかを確認してください。