この章では、Windows用アプリケーションの開発に関する情報の参照先を示し、外部プロシージャの作成およびデバッグ手順を説明します。
この章の項目は次のとおりです。
この項では、Windows用のアプリケーション開発に関する情報の参照先を記載します。これらの製品は、Oracle Databaseサーバーのメディアに含まれています。
Oracle Databaseには、Java Virtual MachineおよびJIT Compilerが統合されています。また、Oracle Databaseでは、Oracle Java Database Connectivity(JDBC)ドライバも提供しています。詳細は、『Oracle Database Java開発者ガイド』および『Oracle Database JDBC開発者ガイド』を参照してください。
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(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
.NET Framework 2.0から、ASP.NETにはデータベースに状態を格納するサービス・プロバイダが含まれています。この状態をデータベースに格納することで、アプリケーションはデータの高可用性を確保すると同時に、すべてのWebサーバーでデータを平等に利用できるようにします。詳細は、『Oracle Providers for ASP.NET開発者ガイド』を参照してください。
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 Database for Windowsでは、Oracle Databaseをリソース・マネージャとして使用して、Microsoft Transaction ServerへのCOM/COM+コンポーネントのデプロイを改善できます。詳細は、『Oracle Services for Microsoft Transaction Server開発者ガイド』を参照してください。
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』を参照してください。
Open Database Connectivity (ODBC)は、データベース管理システムからデータにアクセスするアプリケーションの共通Cプログラミング・インタフェースを提供します。データベースへのアクセスはODBCドライバ・マネージャにより管理されます。ドライバ・マネージャは、特定のデータベース管理システムに対し、ODBCアプリケーションとODBCドライバ間のリンケージを提供します。
Oracle ODBC Driverにより、ODBCインタフェースを使用して作成されたアプリケーションはOracleデータベースへアクセスできます。
Oracle Technology Networkには、Oracleホーム・ベースのODBCドライバとInstant Client対応のODBCドライバの両方が用意されています。
注意: Instant Client対応ODBCドライバを次のサイトからダウンロードします。
|
注意: Oracle ODBCドライバは定期的に更新されます。使用可能な最新のリリースはメディアに収録されています。最新リリースをダウンロードするには、http://www.oracle.com/technology/index.html にアクセスしてください。
「テクノロジ/ユーティリティ/ドライバ」リストから「Oracle ODBC Driver」を選択します。 |
Oracle COM Automation機能により、PL/SQLおよびJavaストアド・プロシージャ開発者とCOM/COM+開発者は、Oracle DatabaseからCOM/COM+オブジェクトをロードできます。詳細は、『Oracle COM Automation機能開発者ガイド』を参照してください。
この項では、Windowsで外部プロシージャを作成および使用する方法を説明します。次のファイルは、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管理者ガイド』を参照してください。 |
外部プロシージャを作成して使用するには、次の処理を行う必要があります。
注意:
|
この項では、Oracle DatabaseとOracle Netのインストールおよび構成について説明します。
Windowsサーバーで次の製品をインストールするには、『Oracle Databaseインストレーション・ガイドfor Microsoft Windows』の手順に従います。
データベース・サーバーのインストール時に、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; } }
第3世代プログラミング言語で外部プロシージャを記述したら、該当するコンパイラとリンカーを使用してDLLをビルドして、前述したように外部プロシージャをエクスポートするようにしてください。DLLのビルドとDLLの関数エクスポートに関する説明については、コンパイラおよびリンカーのマニュアルを参照してください。
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:\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) ) )
SQL*Plusを起動します。
C:\> sqlplus
適切なユーザー名およびパスワードを入力してデータベースに接続します。
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
を使用しています。
宣言部および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 LIBRARY
、CREATE ANY LIBRARY
、ALTER 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
を実行します。
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が用意されています。このパッケージをインストールするには、PL/SQLデモ・ディレクトリにあるスクリプトdbgextp.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
は、開いているファイルから出力バッファに1行分のテキストを読み込みます。
関連項目: 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への接続を試み、コンピュータからネットワークに接続できるかどうかを確認してください。