13.6.1 外部プロシージャのデフォルト構成
外部プロシージャは、別のプログラムからコールされる、異なる言語で記述されたプロシージャです。例としては、特別な目的の処理を実行するために必要な1つ以上のCルーチンを呼び出すPL/SQLプログラムがあります。
アプリケーションが外部プロシージャをコールすると、Oracle Databaseはextproc
という名前の外部プロシージャ・エージェントを開始します。Oracle Databaseによって確立されたネットワーク接続を使用して、アプリケーションがエージェントに次の情報を渡します。
- DLLまたは共有ライブラリの名前
- 外部プロシージャ名
- 任意のパラメータ
次に、エージェントはDLLや共有ライブラリをロードして外部プロシージャを実行し、外部プロシージャから戻された値をアプリケーションに戻します。エージェントは、外部プロシージャをコールするアプリケーションと同じコンピュータに常駐している必要があります。
外部プロシージャのデフォルト構成を使用する場合、extproc
エージェントはOracle Databaseによって直接生成されます。listener.ora
ファイル、tnsnames.ora
ファイルのいずれも構成の変更は必要ありません。ただし、それらの環境変数を、ORACLE_BASE_HOME/hs/admin
ディレクトリにあるextproc.ora
ファイル内の外部プロシージャによって使用されるように定義する必要があります。外部プロシージャのデフォルトの構成を使用しない場合は、表13-6に示すパラメータを設定する必要があります。
表13-6 listener.oraファイルの外部プロシージャ設定
Oracle Enterprise Manager Cloud Controlのフィールド | listener.oraのパラメータ | 説明 |
---|---|---|
実行可能な外部プロシージャ・エージェントの名前。 ノート: Microsoft Windowsの場合、実行可能ファイルが、 |
||
ノート: 構文: 例: EXTPROC_DLLS環境変数を指定して、extprocエージェントがロードできるDLLを制限します。EXTPROC_DLLS環境変数の指定がない場合、extprocエージェントは、UNIXオペレーティング・システムの場合は EXTPROC_DLLSを次のいずれかの値に設定します。
例: "EXTPROC_DLLS=/home/xyz/mylib.so:/home/abc/urlib.so, LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt" "EXTPROC_DLLS=ONLY:/home/xyz/mylib.so:/home/abc/urlib.so, LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt" "EXTPROC_DLLS=ANY,LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt" ノート: 有効なユーザーと実際のユーザー、または有効なグループと実際のグループが異なる場合、 |
||
エージェントのOracleホームの場所。 |
||
外部プロシージャ・エージェントのシステム識別子(任意の名前)。 Oracleリスナーによって生成された外部プロシージャ・エージェントの使用方法の詳細は、外部プロシージャを使用する場合のOracle Net Servicesの構成の例を参照してください。 |
脚注1
DLLは、Microsoft Windowsではセミコロン(;)で区切ります。
ノート:
外部プロシージャのデフォルト構成では、ネットワーク・リスナーがOracle Databaseおよびextproc
エージェントを使用する必要はありません。extproc
エージェントはOracle Databaseによって直接生成されるため、Oracleリスナーによって予期せずextproc
エージェントが生成される恐れはありません。セキュリティを最大限にするため、このデフォルト構成をお薦めします。
外部プロシージャのデフォルト構成を変更し、Oracleリスナーによってextproc
エージェントを生成できます。このためには、追加のネットワーク構成ステップを実行する必要があります。
次のものを使用する場合、Oracleリスナーによってextproc
エージェントを生成する必要があります。
-
マルチスレッド・エージェント
-
MTSモードのOracle Database(Microsoft Windows)
-
外部プロシージャを別のextprocエージェントにリダイレクトできるような、LIBRARY指定のAGENT句またはPROCEDURE指定の
AGENT IN
句。
関連項目:
外部プロシージャの保護の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。親トピック: サード・パーティのデータベース・サービスへの接続の構成
13.6.1.1 外部プロシージャを使用する場合のOracle Net Servicesの構成
外部プロシージャのデフォルト構成を変更し、旧リリースのOracle Databaseに類似したリスナーによってextprocエージェントを生成できます。プロセスは次のとおりです。
1. 既存のリスナーを構成するか、新規リスナーを作成して、外部プロシージャを処理します。
例13-1では、listener.ora
ファイルの構成例を示します。
例13-1 外部プロシージャを設定したlistener.oraファイル
LISTENER=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=sale-server)(PORT=1521))
(ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=sales.us.example.com)
(ORACLE_HOME=/oracle)
(SID_NAME=sales))
(SID_DESC=
(SID_NAME=plsextproc)
(ORACLE_HOME=/oracle)
(PROGRAM=extproc)))
2. tnsnames.ora
に新しいエントリを追加します。
例13-2では、tnsnames.ora
ファイルの構成例を示します。
例13-2 外部プロシージャを設定したtnsnames.oraファイル
EXTPROC_CONNECTION_DATA_1= (DESCRIPTION= (ADDRESS=(PROTOCOL=ipc)(KEY=extproc)
) (CONNECT_DATA=(SID=plsextproc)
))
3. 外部プロシージャを別のextproc
エージェント(Oracleリスナーによって生成されたextproc
など)にリダイレクトできるような、LIBRARY
指定のAGENT
句またはPROCEDURE
指定のAGENT IN
句を使用します。
$ cat test.c
#include <stdlib.h>
int negative(char* db, int n)
{
return -1*n;
}
char* mygetenv(const char* env)
{
return getenv(env);
}
$ gcc -shared -fPIC -o test.so test.c
$ cp test.so $ORACLE_HOME/lib
SQL*PLUS
で、次を実行します。
DROP DATABASE LINK extproclink;
CREATE DATABASE LINK extproclink USING 'extproc_connection_data_1';
CREATE OR REPLACE LIBRARY test1 AS '$ORACLE_HOME/lib/test.so';
/
--
-- Use 'AGENT' clause in LIBRARY SPEC
--
CREATE OR REPLACE LIBRARY test2 AS '$ORACLE_HOME/lib/test.so' AGENT 'extproclink';
/
--
-- Use 'AGENT IN' clause in FUNCTION
--
CREATE OR REPLACE FUNCTION ftest1(x VARCHAR2, y BINARY_INTEGER)
RETURN BINARY_INTEGER
AS LANGUAGE C
LIBRARY test1
NAME "negative"
PARAMETERS(x STRING, y INT)
AGENT IN ( x );
/
CREATE OR REPLACE FUNCTION ftest2(x VARCHAR2)
RETURN VARCHAR2
AS LANGUAGE C
LIBRARY test2
NAME "mygetenv";
/
$ select ftest1('extproclink', 123) from dual;
$ select ftest2('LD_LIBRARY_PATH') from dual;
外部プロシージャのリスナーには、oracle
ユーザーが所有するファイルへの一般的なアクセス権のないユーザー・アカウントを含めないようにしてください。具体的には、このユーザーは、データベース・ファイルまたはOracleサーバーのアドレス空間に対する読取り権限または書込み権限を持つことはできません。また、このユーザーは、listener.ora
ファイルへの読取りアクセス権を持つ必要がありますが、書込みアクセス権は持つことはできません。
低い権限でリスナーを実行することによって、リスナー制御のSET
コマンドを使用せずに、listener.ora
ファイルにあるリスナーの構成を変更できます。このため、オラクル社では、リスナーの実行前にlistener.ora
ファイルの構成を完了することをお薦めします。
13.6.1.1.1 外部プロシージャのデフォルト構成の変更
外部プロシージャのデフォルト構成を変更するには、外部プロシージャを処理するための別のリスナーまたは既存のリスナーを構成および実行します。次の手順では、デフォルトの構成を変更する方法について説明します。
-
次のようにOracle Net Configuration Assistantを使用して、外部プロシージャを処理するための既存のリスナーを構成します。ほとんどのインストールの場合、このリスナーの名前は
LISTENER
です。-
Oracle Enterprise Manager Cloud Controlの「Net Services管理」ページにアクセスします。
-
「管理」リストから「リスナー」を選択し、構成ファイルの場所を含むOracleホームを選択します。
-
「実行」をクリックします。
「リスナー」ページが表示されます。
-
Oracle Net Configuration Assistantによって生成された既存のリスナーを選択し、「編集」をクリックします。
リスナーの編集ページが表示されます。
-
アドレス・セクションで外部プロシージャのプロトコル・アドレスを選択し、「追加」をクリックします。
-
「その他のサービス」タブをクリックします。
-
外部プロシージャのサービス情報を表す行を選択し、「追加」をクリックします。
-
-
表13-6に示されるパラメータを含めたextprocに関するサービス情報を、
listener.ora
ファイルに追加します。
13.6.1.1.2 外部プロシージャを実行するための新規リスナーの作成
外部プロシージャを処理するための別のリスナーを構成および実行するには、Oracle Net Configuration Assistantを使用して別のリスナーの外部プロシージャ・エントリを作成します。次の手順では、新しいリスナーを作成する方法について説明します。
-
次のように、外部プロシージャを排他的に処理するリスナーを作成します。
-
「リスナー」ページにナビゲートします。
-
「作成」をクリックします。
「リスナーを作成」ページが表示されます。
-
一意のリスナー名を「リスナー名」フィールドに入力します(「リスナー名」フィールドに
LISTENEREXTPROC
など)。
-
-
アドレス・セクションに、次のようにIPCプロトコル・アドレスを構成します。
-
「追加」をクリックします。
「アドレスの追加」ページが表示されます。
-
「プロトコル」リストからIPCを選択します。
-
「キー」フィールドに、extprocエージェントのキー値を入力します。
-
「OK」をクリックします。
関連項目:
リスナー・プロトコル・アドレスの構成の詳細は、「リスニング用プロトコル・アドレスの構成」を参照してください
-
-
表13-6に示されるパラメータを含めたextprocに関するサービス情報を、次のように
listener.ora
ファイルに追加します。-
「その他のサービス」タブをクリックします。
-
「追加」をクリックします。
「その他のサービスの作成」ページが表示されます。
-
次の値をフィールドに入力します。
-
extproc
を「プログラム名」フィールドに。 -
extproc
実行ファイルが存在するOracleホームを「Oracleホーム・ディレクトリ」フィールドに。 -
extproc
などのシステム識別子を「SID」フィールドに。
-
-
環境変数セクションで、「行の追加」をクリックします。
-
EXTPROC_DLLS環境変数を「名前」フィールドに、DLLのディレクトリ・パスとファイル名を「値」フィールドに入力します。
-
「OK」をクリックします。
「リスナーを作成」ページが表示されます。
-
「OK」をクリックしてリスナーを追加します。
リスナーが「リスナー」ページに追加されます。
listener.ora
ファイルの外部プロシージャに関する情報は、次の出力のように更新されます。LISTENEREXTPROC= (DESCRIPTION= (ADDRESS= (PROTOCOL=ipc)(KEY=extproc)))
-
-
oracle
ユーザーより低い権限のユーザー・アカウントから、外部プロシージャのリスナーを起動します。
関連項目:
-
リスナー制御ユーティリティの
START
コマンドを使用してリスナーを起動する方法については、「Oracle Net ListenerとOracle Databaseサーバーの起動」を参照してください -
外部プロシージャ・コールを使用可能にする方法については、『Oracle Database開発ガイド』を参照してください。