6.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クラス・ファイルをロードできます。

6.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)が出力されます。

6.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スキーマ内を検索します。必要に応じて、別のリゾルバを指定できます。

6.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';

6.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ツールを使用してコールすることもできます。