5.3 Javaストアド・プロシージャの実行
Javaストアド・プロシージャは、PL/SQLストアド・プロシージャと同じ方法で実行できます。Javaストアド・プロシージャは、トリガーまたはSQL DMLコールの結果としてコールされることが一般的なため、通常はデータベース操作の結果として実行されます。Javaストアド・プロシージャをコールするには、コール仕様を使用して公開する必要があります。
Javaストアド・プロシージャをコールする前に、それらをOracle Databaseインスタンスにロードし、SQLに対して公開する必要があります。ロードと公開は別のタスクです。多くのJavaクラスは、他のJavaクラスからのみ参照されるため公開されることはありません。
Javaストアド・プロシージャを自動的にロードするには、loadjava
ツールを使用します。これは、Javaのソース、クラスおよびリソース・ファイルを、システムによって生成されたデータベース表にロードし、次にSQLのCREATE JAVA {SOURCE | CLASS | RESOURCE}
文を使用して、JavaファイルをOracle Databaseインスタンスにロードします。Javaファイルは、ファイル・システム、一般的なJava IDE、イントラネットまたはインターネットからアップロードできます。
Javaストアド・プロシージャを作成、ロードおよびコールするには、次のステップを実行する必要があります。
ノート:
Javaストアド・プロシージャを手動でロードするには、CREATE JAVA
文を使用できます。たとえば、SQL*Plusでは、CREATE JAVA CLASS
文を使用して、ローカルのBFILE
およびLOB
列からOracle DatabaseにJavaクラス・ファイルをロードできます。
5.3.1 Javaクラスの作成または再利用
任意のJava IDEを使用してクラスを作成するか、または必要に応じた既存のクラスを再利用します。Oracle Databaseでは、多数のJava開発ツールおよびクライアント・サイドのプログラム・インタフェースがサポートされます。たとえば、Oracle JVMでは、Oracle JDeveloper、Symantec Visual CafeおよびBorland JBuilderなどの一般的なJava IDEで開発されたプログラムを使用できます。
次の例では、public
クラスOscar
を作成します。これには、Oscar Wildeの引用句を戻すquote()
という単一のメソッドがあります。
public class Oscar { // return a quotation from Oscar Wilde public static String quote() { return "I can resist everything except temptation."; } }
クラスをOscar.java
として保存します。Javaコンパイラを使用して、次のように、.java
ファイルをクライアント・システム上でコンパイルします。
javac Oscar.java
コンパイラによって、Javaバイナリ・ファイル(この例の場合はOscar.class
)が出力されます。
5.3.2 Javaクラスのロードおよび解決
loadjava
ツールを使用すると、Javaのソース、クラスおよびリソース・ファイルをOracle Databaseインスタンスにロードでき、これらはJavaスキーマ・オブジェクトとして格納されます。loadjava
ツールはコマンドラインまたはアプリケーションから実行でき、リゾルバなどいくつかのオプションを指定できます。
次の例では、loadjava
ツールがデフォルトのJDBC OCIドライバを使用してデータベースに接続します。ユーザー名とパスワードを指定する必要があります。デフォルトでは、クラスOscar
はユーザーのログインするスキーマ(この場合はHR
)にロードされます。
$ loadjava -user HR Oscar.class
Password: password
quote()
メソッドをコールすると、サーバーはリゾルバを使用して、String
などのサポート・クラスを検索します。この場合はデフォルトのリゾルバが使用されます。デフォルトのリゾルバは最初に現行スキーマ内、次に、すべてのコアなJavaクラス・ライブラリが常駐しているSYS
スキーマ内を検索します。必要に応じて、別のリゾルバを指定できます。
5.3.3 Javaクラスの公開
SQLまたはJDBCからコール可能な各Javaメソッドに対して、メソッドのトップレベルのエントリ・ポイントをOracle Databaseに公開するコール仕様を記述する必要があります。通常、必要となるコール仕様は少数です。必要な場合は、Oracle JDeveloperを使用してこれらのコール仕様を生成できます。
次のSQL*Plusの例では、データベースに接続した後、quote()
メソッド用のトップレベルのコール仕様を定義します。
SQL> connect HR
Enter password: password
SQL> CREATE FUNCTION oscar_quote RETURN VARCHAR2
2 AS LANGUAGE JAVA
3 NAME 'Oscar.quote() return java.lang.String';
関連トピック
5.3.4 ストアド・プロシージャのコール
Javaストアド・プロシージャは、JDBC、SQLJ、およびコール仕様にアクセスできるすべてのサード・パーティ言語からコールできます。SQLのCALL
文を使用すると、トップレベル(たとえば、SQL*Plus)からストアド・プロシージャをコールできます。ストアド・プロシージャはデータベース・トリガーからもコールできます。
次の例では、SQL*Plusのホスト変数を宣言します。
SQL> VARIABLE theQuote VARCHAR2(50);
この後で、oscar_quote()
ファンクションを次のようにコールします。
SQL> CALL oscar_quote() INTO :theQuote; SQL> PRINT theQuote; THEQUOTE -------------------------------------------------- I can resist everything except temptation.
また、Javaクラスはojvmjava
ツールを使用してコールすることもできます。
関連トピック