Windowsで外部プロシージャを作成および使用する方法について説明します。
次のファイルは、ORACLE_HOME
\rdbms\extproc
にあります。
extern.c
は、「外部プロシージャの作成」に示すコードの例です。
make.bat
は、Dynamic Link Libraryを構築するバッチ・ファイルです。
extern.sql
は、「外部プロシージャの登録」および「外部プロシージャの実行」で説明する手順を自動化します。
EXTPROC
によって起動することができます。 CREATE LIBRARY
、CREATE ANY LIBRARY
、ALTER ANY LIBRARY
およびEXECUTE ANY LIBRARY
権限と、EXECUTE ON
library_name
の付与によって、ユーザーに大きな力が与えられます。 親トピック: Windows用アプリケーションの開発
外部プロシージャは、第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プログラムから直接コールできます。
外部プロシージャを使用して、特定の処理を行えます。
科学的問題や工学的問題の解決
データの分析
デバイスやプロセスのリアルタイム制御
注意:
外部プロシージャを処理するようにリスナーを構成する場合には、セキュリティ上の特別な予防手段が保証されます。
外部プロシージャを作成して使用するには、次の手順を実行します。
注意:
DLLをビルドするには、Cコンパイラおよびリンカーがシステムにインストールされている必要があります。
4番目と5番目のタスクの説明にある処理は、外部プロシージャの登録および実行の処理を自動化する、1つのSQLスクリプトにできます。これらの処理を結合したSQLスクリプトの例は、ORACLE_HOME
\rdbms\extproc\extern.sql
を参照してください。
親トピック: 外部プロシージャの構築について
Oracle DatabaseおよびOracle Netのインストールと構成について説明します。
listener.ora
およびtnsnames.ora
ファイルが構成されます。親トピック: 外部プロシージャの構築について
Windows ServerにOracle Databaseをインストールする方法について説明します。
以降の手順に従って、Windows Serverに次の製品をインストールします。
関連項目:
『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 starts 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に登録する必要があります。
セキュリティを強化するために、EXTPROC
プロセスを構成すると、CREDENTIAL
を介して認証できます。
Oracle DatabaseではCREATE LIBRARY
コマンドの新しい2つの拡張がサポートされます。これは、CREDENTIAL
句およびDIRECTORY
オブジェクト・オプションです。CREDENTIAL
句はユーザーのEXTPROC
の実行を定義し、DIRECTORY
オブジェクト・オプションはDLLを配置するディレクトリを指定します。
親トピック: 外部プロシージャの構築について
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
を実行します。
関連トピック
親トピック: 外部プロシージャの構築について