ODE.NETについて軽くまとめ
ODE.NET環境を作る度に「どうだったっけ?」と悩んでしまうので忘れないように簡単にまとめます。
ODE.NETを使うためにはORACLEインストール時にODE.NET(Oracle Database Extensions for .NET)を選択する必要があります。
カスタムで選択することになるので時間があるのであれば通常のインストール後に追加でODE.NETをインストールするのが楽かもしれません。
データベースを作成するときに「Oracle Database Extensions」にチェックを入れる必要があります。しかし、チェックせずにデータベースを作成したとしても「Database Configuration Assistant」ツールで「Oracle Database Extensions」を追加する事ができます。
余談ですが、データベースを共有サーバーに切り替える時も「Database Configuration Assistant」ツールで行います。
作成したストアドプロシージャの配置場所はORACLE_HOMEのbin¥clrとなりますが、このclrフォルダが作成されていない場合があります。その場合は作成しましょう。
あとはソリューション又はプロジェクトの配置でサーバーにアセンブリを転送します。
ストアドを実行すると、「ORA-28575: 外部プロシージャ・エージェントへのRPC 接続をオープンできません。」とのエラーが出ることがあります。これはリスナーの設定がされていない場合に発生します。
ORACLE_HOMEのNETWORK¥ADMINにあるlistener.oraとtnsnames.oraを確認します。
listener.ora
の様な記述がされていれば大丈夫ですが、ORA-28575が発生する場合はこの記述が抜けている可能性があります。
またSID_LIST_LISTENERの記述そのものが無かった場合、上記のような記述を追加してもエラーとなります。作成したデータベースのSIDの記述を追加する必要があります。
これらは「Net Configuration Assistant」ツールのリスナー構成で構築できるそうです。私は使ったことがありませんが...
tnsnames.ora
この記述が無ければODE.NETが使用できません。但し、気をつけなければならないのは「(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))」の記述です。これをそのまま信じて記述しても動作しない事があります。それはlistener.oraの「LISTENER =」で「(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)」と記述されている場合はtnsnames.oraも「(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)」と記述する必要があるからです。
具体的には
となります。引用する例での環境に惑わされずに自分の環境を良く観察しましょう。
最後にオラクルのサービスとしてClrAgentサービスが開始されている事を確認しましょう。このサービスが動作していないとエラーになります。
ODE.NETを使うためにはORACLEインストール時にODE.NET(Oracle Database Extensions for .NET)を選択する必要があります。
カスタムで選択することになるので時間があるのであれば通常のインストール後に追加でODE.NETをインストールするのが楽かもしれません。
データベースを作成するときに「Oracle Database Extensions」にチェックを入れる必要があります。しかし、チェックせずにデータベースを作成したとしても「Database Configuration Assistant」ツールで「Oracle Database Extensions」を追加する事ができます。
余談ですが、データベースを共有サーバーに切り替える時も「Database Configuration Assistant」ツールで行います。
作成したストアドプロシージャの配置場所はORACLE_HOMEのbin¥clrとなりますが、このclrフォルダが作成されていない場合があります。その場合は作成しましょう。
あとはソリューション又はプロジェクトの配置でサーバーにアセンブリを転送します。
ストアドを実行すると、「ORA-28575: 外部プロシージャ・エージェントへのRPC 接続をオープンできません。」とのエラーが出ることがあります。これはリスナーの設定がされていない場合に発生します。
ORACLE_HOMEのNETWORK¥ADMINにあるlistener.oraとtnsnames.oraを確認します。
listener.ora
SID_LIST_LISTENER =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
)
の様な記述がされていれば大丈夫ですが、ORA-28575が発生する場合はこの記述が抜けている可能性があります。
またSID_LIST_LISTENERの記述そのものが無かった場合、上記のような記述を追加してもエラーとなります。作成したデータベースのSIDの記述を追加する必要があります。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = xxxx)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(SID_NAME = xxxx)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
)
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = xxxx)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(SID_NAME = xxxx)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:¥app¥Administrator¥product¥11.1.0¥db_1)
(PROGRAM = extproc)
)
)
これらは「Net Configuration Assistant」ツールのリスナー構成で構築できるそうです。私は使ったことがありませんが...
tnsnames.ora
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
この記述が無ければODE.NETが使用できません。但し、気をつけなければならないのは「(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))」の記述です。これをそのまま信じて記述しても動作しない事があります。それはlistener.oraの「LISTENER =」で「(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)」と記述されている場合はtnsnames.oraも「(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)」と記述する必要があるからです。
具体的には
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
となります。引用する例での環境に惑わされずに自分の環境を良く観察しましょう。
最後にオラクルのサービスとしてClrAgentサービスが開始されている事を確認しましょう。このサービスが動作していないとエラーになります。
この記事に対するコメント