この章では、Windows用アプリケーションの開発に関する情報の参照先を示し、外部プロシージャの作成およびデバッグ手順を説明します。
この章の項目は次のとおりです。
この項では、Windows用のアプリケーション開発に関する情報の参照先を記載します。これらの製品は、Oracle Databaseサーバーのメディアに含まれています。
|
注意: Oracle Objects for OLE (OO4O)、Oracle COM Automation on WindowsおよびOracle Counters for Windows Performance Monitorは、Oracle Database 12cリリース1 (12.1) for 64-bit and 32-bit 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用のMicrosoft ADO.NETデータ・プロバイダの実装です。ODP.NETにより、Oracle固有のAPIを使用して、任意の.NETアプリケーションからOracleのデータおよび機能に迅速かつ信頼性の高い方法でアクセスできます。また、ODP.NETでは、Microsoft .NET Frameworkクラス・ライブラリで利用可能なクラスとインタフェースが使用および継承されます。詳細は、『Oracle Data Provider for .NET開発者ガイドfor Microsoft Windows』およびMy Oracle Support Note 726240.1を参照してください。
Oracle Developer Tools for Visual Studio(ODT)は、Microsoft Visual Studio用に緊密に統合されたアドインです。ODTがVisual Studioに統合されるため、視覚的に統合されたデザイナを使用してOracleスキーマ・オブジェクトを簡単に参照したり編集したりでき、また単にドラッグ・アンド・ドロップするだけで.NETコードを自動的に生成できます。開発者は、表データの変更、Oracle SQL文の実行、PL/SQLコードの編集とデバッグ、SQLスクリプトの生成と編集、および.NETストアド・プロシージャの開発とデプロイを行うことができます。これらのツールには他にも様々な機能が用意されています。詳細は、次の場所にあるODT Webホームにアクセスしてください。
http://www.oracle.com/technetwork/developer-tools/visual-studio/overview/index.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がサポートするインターネット・アプリケーションとしては、Oracle WebCenter Portal(データをWebに公開するアプリケーション)、Oracle Web Tier (Oracle HTTP Server)、PL/SQL組込み式のゲートウェイ(Oracle Databaseに格納されているPL/SQLプロシージャをブラウザから起動できるようにするアプリケーション)があります。詳細は、次を参照してください。
『Oracle Fusion Middleware Oracle WebCenter Portalインストレーション・ガイド』
『Oracle Fusion Middleware Oracle WebCenter Portal開発者用チュートリアル』
『Oracle Enterprise Manager Grid Controlインストレーションおよび基本構成』
Oracle Databaseには、最大のPHP、Ruby、Python WebおよびRich Internet Applicationsの要件に対応する組込みのメカニズムが用意されています。非標準接続、スケーラビリティ、キャッシュ、負担のかからないパフォーマンス・アクセラレーション、高度なセキュリティ、高可用性などの機能があります。
Oracle Services for Microsoft Transaction Serverを使用すると、Oracle DatabaseはMicrosoft Distributed Transaction Coordinator (DTC)トランザクションのリソース・マネージャとなることができます。Oracle Services for Microsoft Transaction ServerはOracle Databaseに対しDTCへのプロキシとして動作します。詳細は、『Oracle Services for Microsoft Transaction Server開発者ガイド』を参照してください。
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
この項では、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プロセスは、サーバー・プロセスで直接通信します。リスナーによって確立されたネットワーク接続を使用して、アプリケーションから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をビルドした後は、システム内の任意のディレクトリに移動できます。
EXTPROCのデフォルトの動作では、DLLはORACLE_HOME\binまたはORACLE_HOME\libからのみロードされます。他のディレクトリからDLLをロードするには、環境変数EXTPROC_DLLSを、完全パスで修飾されたDLL名をコロン(:)で区切ったリスト(Windowsシステムではセミコロン区切り)に設定する必要があります。この環境変数を設定する優先方法は、listener.oraのENVSパラメータを使用する方法です。
|
関連項目: EXTPROCの詳細は、『Oracle Database開発ガイド』を参照してください。 |
外部プロシージャを含むDLLをビルドした後は、外部プロシージャをOracle Databaseに登録する必要があります。Oracle Database 12cリリース1 (12.1)から、セキュリティ強化のために、CREDENTIALを介して認証されるようにEXTPROCプロセスを構成できます。
Oracle Database 12cリリース1 (12.1)ではCREATE LIBRARYコマンドの新しい2つの拡張がサポートされます。これは、CREDENTIAL句およびDIRECTORYオブジェクト・オプションです。CREDENTIAL句はユーザーのEXTPROCの実行を定義し、DIRECTORYオブジェクト・オプションはDLLを配置するディレクトリを指定します。
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\12.1.0\dbhome_1\rdbms\extproc\extern.dll) (ORACLE_HOME=C:\app\oracle\product\12.1.0\dbhome_1) (PROGRAM=extproc) ) )
SQL*Plusを起動します。
C:\> sqlplus
適切なユーザー名およびパスワードを入力してデータベースに接続します。
CREATE LIBRARYコマンドでPL/SQLライブラリを作成します。
DBMS_CREDENTIAL.CREATE_CREDENTIAL(...); CREATE DIRECTORY DLL_LOC as ...; CREATE LIBRARY externProcedures as 'extern.dll' in DLL_LOC credential the_credential;
the_credentialはDBMS_CREDENTIAL.CREATE_CREDENTIALの起動時に選択される名前です。
SQL> CREATE LIBRARY externProcedures AS 'C:\app\oracle\product\12.1.0\dbhome_1\rdbms\ extproc\extern.dll';
externProceduresは、別名のライブラリ(実際にはデータベースのスキーマ・オブジェクト)です。
C:\app\oracle\product\12.1.0\dbhome_1\rdbms\extproc\extern.dll
これは、Windowsオペレーティング・システムのdllextern.dllへのパスです。この例では、OracleベースとしてC:\app\oracle\product\12.1.0を、Oracleホームとしてdbhome_1を使用しています。
|
注意: PL/SQLまたはSQLからPL/SQLライブラリの外部プロシージャをコールする必要のあるユーザーに対して、DBAは、PL/SQLライブラリへのEXECUTE権限を付与する必要があります。CREDENTIALおよびDIRECTORYオブジェクトの拡張での個別のEXECUTE権限が、それらが適切に機能するために必要です。 |
宣言部および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行分のテキストを読み込みます。
|
関連項目: 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 |
FSEEK、UTL_FILEサブプログラムは、ファイル内のファイル・ポインタを指定されたバイト数だけ前方または後方に調整します。UTL_FILE.FSEEKが正しく動作するためには、ファイル内の行にプラットフォーム固有の行終端文字が必要です。Windowsプラットフォームでは、適切な行終端文字は<CR><LF>です。
|
関連項目: 『Oracle Database開発ガイド』 |