Oracle Database プラットフォーム・ガイド 10gリリース2(10.2) for Microsoft Windows(64-bit)on Intel Itanium B25021-03 |
|
この章では、Windows用アプリケーションの開発に関する情報の参照先を示し、外部プロシージャの作成およびデバッグ手順を説明します。
この章の項目は次のとおりです。
この項では、Windows用のアプリケーション開発に関する情報の参照先を記載します。これらの製品は、Oracle DatabaseサーバーのCD-ROMに含まれています。
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 Databaseでサポートされるインターネット・アプリケーションには、Oracle Portal、Oracle HTTP Server、およびPL/SQL Embedded Gatewayがあります。Oracle PortalはデータのWeb公開を可能にし、PL/SQL Embedded Gatewayは、Oracle Databaseに格納され、ブラウザから起動できるPL/SQLプロシージャを提供します。詳細は、次のマニュアルを参照してください。
Oracle COM/COM+統合機能により、Javaストアド・プロシージャ開発者およびCOM/COM+開発者は、Oracle DatabaseからCOM+オブジェクトをロードできます。詳細は、次のマニュアルを参照してください。
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 Data Provider for .NET(ODP.NET)は、Oracle Database用データ・プロバイダの実装です。ODP.NETでは、Oracle固有のAPIを使用して、.NETアプリケーションからOracleデータおよび機能への高速で信頼性の高いアクセスを提供します。また、ODP.NETでは、Microsoft .NET Frameworkクラス・ライブラリで使用可能なクラスおよびインタフェースを使用、継承します。詳細は、次のマニュアルを参照してください。
Oracle Database for Windowsでは、Oracle Databaseをリソース・マネージャとして使用して、Microsoft Transaction ServerへのCOM/COM+コンポーネントの配置を改善できます。詳細は、次のマニュアルを参照してください。
Oracle Databaseでは、Windowsアプリケーション開発者向けに総合的なAPIのセットを提供し、JavaおよびCOM/COM+開発の両方に対応しています。Oracle Databaseは、Windows Distributed interNet Application Architecture(DNA)として知られる、Microsoft社の開発および配置コンポーネントに統合されています。次の点で、Windowsでのパフォーマンスおよびデータ・アクセスが向上します。
開発者は新しいデータ・アクセス方法を学ぶ必要はなく、精通したデータ・アクセス方法を使用できるため、データベース・アプリケーションを短期間で配置できます。Oracle Databaseサーバーでは、表15-1に示す様々な方法でWindowsクライアントと通信できます。
開発環境 | データ・アクセス方法 |
---|---|
Java |
SQLJ |
COM/COM+ |
COM/COM+ Automation Feature |
Oracle Databaseデータ・アクセス・インタフェースを使用することにより、開発者は特定のOracle Database機能を利用できます。これらのインタフェースでは、柔軟性およびオープン規格への準拠も提供されます。
Oracle COM/COM+インタフェースでは、次の機能が提供されます。
Oracle Databaseではインターネット・アプリケーション開発のためのWindows拡張機能を提供します。この機能により、次のようなクライアントからのアクセスが可能になります。
Microsoft Transaction Serverとの統合に加え、Oracle Databaseデータ・アクセス・インタフェースおよび開発ツールを使用して、図15-1「Microsoft Transaction ServerとOracle Databaseの統合」に示すようなインターネット・アプリケーションを作成できます。
アプリケーションの作成には、Oracle 64ビット・コンポーネントを使用してください。ビジネス・ロジックの移行については、Microsoft Developer Network(MSDN)Webサイト(http://msdn.microsoft.com/default.asp)の「Migration Tips」を参照してください。
この項では、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 Net Services管理者ガイド』を参照してください。
注意
外部プロシージャを作成して使用するには、次の処理を行う必要があります。
この項では、Oracle DatabaseとOracle Netのインストールおよび構成について説明します。
次の製品をWindowsサーバーにインストールするには、Oracle Databaseのインストレーション・ガイドの手順に従います。
データベース・サーバーのインストール時に、Oracle Netコンフィギュレーション・アシスタントでは、外部プロシージャ・コール用のlistener.ora
およびtnsnames.ora
ファイルが構成されます。
アプリケーションから外部プロシージャがコールされると、Oracle Net Listenerによって、EXTPROCという外部プロシージャ・エージェントが起動されます。リスナーによって確立されたネットワーク接続を使用して、アプリケーションからEXTPROCに次の情報が渡されます。
次に、EXTPROCによってDLLがロードされ、外部プロシージャが実行されて、外部プロシージャから返された値が渡されます。
デフォルトのlistener.ora
およびtnsnames.ora
ファイルを上書きした場合は、次のファイルを手動で構成して、前述の外部プロシージャが起動するようにします。
ORACLE_BASE
¥
ORACLE_HOME
¥network¥admin¥listener.ora
ORACLE_BASE
¥
ORACLE_HOME
¥network¥admin¥tnsnames.ora
第3世代プログラミング言語を使用して、作成したファンクションをDLLに組み込み、EXTPROCによって起動することができます。次のコードは、Microsoft Visual C++で記述したFIND_MAX
という外部プロシージャの簡単な例です。
#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
パラメータを使用する方法です。
外部プロシージャを含む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¥10.2.0¥db_1¥rdbms¥extproc¥extern.dll) (ORACLE_HOME=C:¥oracle¥product¥10.2.0¥db_1) (PROGRAM=extproc) ) )
C:¥> sqlplus
CREATE LIBRARY
コマンドでPL/SQLライブラリを作成します。
SQL> CREATE LIBRARY externProcedures AS 'C:¥oracle¥product¥10.2.0¥db_1¥rdbms¥ extproc¥extern.dll';
externProcedures
は、別名のライブラリ(実際にはデータベースのスキーマ・オブジェクト)です。
C:¥oracle¥product¥10.2.0¥db_1¥rdbms¥extproc¥extern.dll
これは、Windowsオペレーティング・システムのdllextern.dll
へのパスです。この例では、OracleベースとしてC:¥oracle¥product¥10.2.0
を、Oracleホームとしてdb_1
を使用しています。
宣言部およびBEGIN...END
ブロックのかわりにEXTERNAL
句を使用するPL/SQLサブプログラムを記述します。EXTERNAL
句は、PL/SQLと外部プロシージャの間のインタフェースです。EXTERNAL
句は、外部プロシージャに関する次の情報を示します。
次の例では、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プログラム・ユニット(外部ファンクションの別名)をコールする必要があります。これらのコールは、次のいずれにも含めることができます。
「外部プロシージャの登録」で、PL/SQLファンクションPLS_MAX
に、外部プロシージャfind_max
が登録されました。次の手順に従って、find_max
を実行します。
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
権限が必要です。
外部プロシージャをデバッグするには、次のようにします。
Microsoft Visual C++のデバッグ方式でDLLをビルドした場合は、Visual C++が起動します。
PL/SQLデモ・ディレクトリのdbgextp.sql
で示されたブレーク・ポイントを使用します。
パッケージUTL_FILE
を使用すると、PL/SQLプログラムでオペレーティング・システムのテキスト・ファイルを読取りおよび書込みできます。このパッケージは、開く、挿入、取得、終了などの標準のオペレーティング・システム・ストリーム・ファイルI/O操作の制限付きバージョンを提供します。テキスト・ファイルを読取りまたは書込みする場合は、関数fopen
をコールします。この関数は、後続のプロシージャ・コールで使用するファイル・ハンドルを返します。たとえば、プロシージャput_line
は、テキスト文字列と行終端文字を開いたファイルに書き込み、プロシージャget_line
は開いたファイルから出力バッファにテキスト行を読み取ります。
FSEEK
、UTL_FILE
サブプログラムは、ファイル内のファイル・ポインタを指定されたバイト数だけ前方または後方に調整します。UTL_FILE.FSEEK
が正しく動作するためには、ファイル内の行にプラットフォーム固有の行終端文字が必要です。Windowsプラットフォームでは、適切な行終端文字は<CR><LF>
です。
この項の項目は次のとおりです。
Intercartridge Exchangeを使用する前に、レジストリにパラメータを追加する必要があります。
C:¥> regedt
「レジストリ エディタ」ウィンドウが表示されます。
HTTP_PROXY
を追加します。このパラメータの位置は、コンピュータにOracleホーム・ディレクトリがいくつあるかによって決まります。ホーム・ディレクトリが1つしかない場合は、次の位置にHTTP_PROXY
を追加します。
HKEY_LOCAL_MACHINE¥SOFTWARE¥ORACLE¥HOME0
複数のホーム・ディレクトリがある場合は、次の位置に追加します。
HKEY_LOCAL_MACHINE¥SOFTWARE¥ORACLE¥KEY_HOME_NAME
「値の追加」ダイアログが表示されます。
HTTP_PROXY
と入力し、「データ型」フィールドにREG_SZ
と入力します。
www-proxy.
your-site
を入力します。この例では、Webサイトはmarketing.com
です。実際のWebサイトのドメイン名を入力します。
Intercartridge Exchangeでは、UTL_HTTP
というストアド・パッケージを使用して、PL/SQL、SQLおよびSQL*Plus文から、Hypertext Transfer Protocol(HTTP)をコールできます。
UTL_HTTP
を使用すると、次の処理を両方実行できます。
UTL_HTTP
には、パッケージ・ファンクションという2つの類似したエントリ・ポイントが含まれます。パッケージ・ファンクションは、PL/SQL文とSQL文からHTTPコールを行います。
両方のパッケージ・ファンクションは、次のタスクを実行します。
両方のパッケージ・ファンクションで使用する宣言部は、次の各項で示します。
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への接続を試み、コンピュータからネットワークに接続できるかどうかを確認してください。
|
Copyright © 1996, 2007 Oracle Corporation. All Rights Reserved. |
|