18 C、C++およびJavaを使用したカートリッジ・サービス
カートリッジ・サービスは、C/C++およびJavaを使用するプログラマが使用できます。
関連項目:
Cを使用したカートリッジ・サービスの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。
18.1 外部プロシージャ用のOCIアクセス・ファンクション
外部プロシージャからコールされたサービス・ルーチンは、例外の発生、メモリーの割当ておよびサーバーへのコールバックに使用するOCIハンドルの取得を行うことができます。ファンクションを使用するには、外部プロシージャにコンテキスト構造を渡せるように、WITH
CONTEXT
句を指定する必要があります。コンテキスト構造は、ヘッダー・ファイルociextp.h
内で次のように宣言されます。
typedef struct OCIExtProcContext OCIExtProcContext;
サービス・ルーチンでコンテキスト情報がどのように使用されるかを説明します。詳細と使用例は、Oracle Databaseアドバンスト・アプリケーション開発者ガイドを参照してください。
18.1.1 OCIExtProcAllocCallMemory
このサービス・ルーチンは、外部プロシージャ・コールの間、nバイトのメモリーを割り当てます。ファンクションにより割り当てられたメモリーは、制御がPL/SQLに戻ると解放されます。
メモリーの割当てや解放には他のファンクションを使用しないでください。
この関数のCプロトタイプは、次のとおりです。
void *OCIExtProcAllocCallMemory( OCIExtProcContext *with_context, size_t amount);
パラメータwith_contextおよびamountは、それぞれ、コンテキスト・ポインタと割り当てられるバイト数です。この関数は、割り当てられたメモリーを指す型が未定のポインタを戻します。戻り値が0(ゼロ)の場合は、失敗を示します。
18.1.2 OCIExtProcRaiseExcp
このサービス・ルーチンは事前定義の例外を発生させます。この例外は、1
から32767
の範囲の有効なOracleエラー番号を含んでいます。必要なクリーン・アップの実行直後に、外部プロシージャが値を戻す必要があります。クリーン・アップ処理後、外部プロシージャをすぐに戻す必要があります(OUT
またはIN
OUT
パラメータには値は何も割り当てられません)。この関数のCプロトタイプは、次のとおりです。
int OCIExtProcRaiseExcp( OCIExtProcContext *with_context, size_t error_number);
パラメータwith_contextおよびerror_number は、それぞれコンテキスト・ポインタとOracleエラー番号です。戻り値のOCIEXTPROC_SUCCESS
およびOCIEXTPROC_ERROR
は、正常終了および失敗を示します。
18.1.3 OCIExtProcRaiseExcpWithMsg
このサービス・ルーチンは、ユーザー定義例外を発生させてユーザー定義のエラー・メッセージを戻します。この関数のCプロトタイプは、次のとおりです。
int OCIExtProcRaiseExcpWithMsg( OCIExtProcContext *with_context, size_t error_number, text *error_message, size_t len);
パラメータwith_context
、error_number
およびerror_message
は、それぞれコンテキスト・ポインタ、Oracleエラー番号、エラー・メッセージ・テキストです。パラメータlenには、エラー・メッセージの長さが格納されます。メッセージがNULL文字で終了する文字列の場合、lenは0(ゼロ)です。戻り値のOCIEXTPROC_SUCCESS
およびOCIEXTPROC_ERROR
は、正常終了および失敗を示します。
18.1.4 OCIExtProcGetEnv
このサービス・ルーチンを使用すると、外部プロシージャ・コール中にデータベースへのOCIコールバックが可能になります。このファンクションで取得されるOCIハンドルは、コールバックにのみ使用してください。そのOCIハンドルを標準OCIコールに使用すると、データベースへの新規接続が確立され、同じトランザクションではコールバックに使用できません。つまり、外部プロシージャ・コール時には、OCIハンドルをコールバックまたは新規接続に使用できますが、両方に使用することはできません。
この関数のCプロトタイプは、次のとおりです。
sword OCIExtProcGetEnv( OCIExtProcContext *with_context, OCIEnv **envh, OCISvcCtx **svch, OCIError **errh);
パラメータwith_contextはコンテキスト・ポインタで、パラメータenvh、svch、errhは、それぞれ、OCI環境、サービス、エラー・ハンドルです。戻り値のOCIEXTPROC_SUCCESS
およびOCIEXTPROC_ERROR
は、正常終了および失敗を示します。
コールバックの使用では、OCIExtProcGetEnv
をコールバックで使用する方法を説明しています。実際の使用例は、PL/SQLデモ・ディレクトリにあるextproc.sqlスクリプトを参照してください。 (このディレクトリの場所については、Oracleインストレーション・ガイドまたはユーザーズ・ガイドを参照してください。)このスクリプトは、外部プロシージャをコールする方法を示しています。付属ファイルextproc.cには、外部プロシージャのCソース・コードが含まれています。デモを実行するには、extproc
.sql
にある指示に従ってください。CREATE
LIBRARY
権限を持つアカウントを使用する必要があります。
18.2 Javaカートリッジ・サービス・ファイルのインストール
ここで説明するJavaクラスを使用するには、ODCI.jar
ファイルとCartridgeServices.jar
ファイルをSYS
スキーマにインストールする必要があります。
Javaオプションをインストール済の場合は、ODCI.jar
およびCartridgeServices.jar
ファイルをインストールする必要があります。Javaオプションをインストールしていない場合、このタスクを実行する必要はありません。
ODCI.jarおよびCartridgeServices.jarファイルをインストールする方法
jar
ファイルのインストールの詳細は、Oracle Databaseアップグレード・ガイドを参照してください。
18.3 カートリッジ・サービス: コンテキストのメンテナンス
Javaカートリッジ・サービスは、コンテキストのメンテナンスに使用されます。これはOCIコンテキスト管理サービスに似ています。サーバーとカートリッジ・コードの間でコンテキストを切り替えるには、このクラスを使用する必要があります。
18.3.1 ContextManager
ContextManagerはObjectを拡張するOracleクラスのコンストラクタです。
クラス・インタフェース
public static Hashtable ctx extends Object
変数
ctx public static Hashtable ctx
コンストラクタ
ContextManager public ContextManager()
メソッド
次のメソッドを使用できます。
setContext (static method in class oracle) getContext (static method in class oracle) clearContext (static method in class oracle)