S-JIS[2005-05-01/2005-05-15] 変更履歴

PL/SQLで使うJava

Oracleの独自言語のPL/SQLから、Javaで書いたプログラムを呼び出すことが出来る。

  1. ソースの登録方法
  2. ラッパーの用意
  3. PL/SQLからの呼び出し

手順

JavaのソースをDB内の専用の場所に取り込み、それをPL/SQLで呼び出せる形式にして使う。

  1. JavaのソースをDBに保存し、コンパイルする。
    これには、SQL*Plusで直接打ち込む方法外部ファイルから読み込む方法がある。
     
  2. PL/SQLから呼び出す為のラッパー関数/プロシージャーを用意する。
     
  3. 作ったプログラムを呼び出す

なお、DBに登録したJavaソースの削除には少し注意が必要。


ソースの登録(直接書き込み)

SQL*Plusから以下のように打ち込み、JavaソースをDBに格納する。

SQL> CREATE OR REPLACE JAVA SOURCE NAMED java_test_src
  2  AS
  3  import java.util.*; //この例では使っていないのでjava.utilパッケージは宣言不要だが、importの例として明示
  4 
  5  public class Test {
  6 
  7 	public static void kasan(int a,int b,int[] ret){
  8 		ret[0]=a+b;
  9 	}
 10 
 11 	public static int kasan(int a,int b){
 12 		return a+b;
 13 	}
 14 
 15  }
 16  /

Javaが作成されました。

PL/SQLに値を返す変数(PL/SQLでの引数の指定がOUTやINOUT)の場合、Java側では配列として定義する。

Java内での関数のオーバーロード(同名で引数の種類が異なる定義)は使用可能。

もしJavaのソースとして間違いがあると、エラーが表示される。

同じクラスを別のソース名(上記の例でいうとjava_test_src)で登録しようとすると下記のようなエラーになるので、その場合は古いソースを削除してやる必要がある。

CREATE OR REPLACE JAVA SOURCE NAMED java_test_src
                                    *
行1でエラーが発生しました。:
ORA-29542: クラスTestはソースJAVA_TEST_1ですでに定義されています。

ソースの登録(ファイルから読み込み)

JavaのソースファイルをDBに登録する為のコマンドが用意されている。
Windowsならコマンドプロンプトから以下のコマンドを実行する。
(バッチファイルにしておくと、実行が終わった途端になぜかコマンドプロンプトが消えて結果が見られない…)

> loadjava -verbose -force -resolve -user scott/tiger Test.java

Test.java:

import java.util.*; //この例では使っていないのでjava.utilパッケージは宣言不要だが、importの例として明示

public class Test {

	public static void kasan(int a,int b,int[] ret){
		ret[0]=a+b;
	}

	public static int kasan(int a,int b){
		return a+b;
	}

}

これは、SQL*Plusから作成(「CREATE OR REPLACE JAVA SOURCE NAMED "Test"」(クラス名)で作成)したのと同じことになる。
削除時に注意が必要)


ラッパー関数/プロシージャーの用意

PL/SQLからJavaのプログラムを呼び出す為のラッパーを作成する。

SQL> CREATE OR REPLACE PROCEDURE kasan(a in number,b in number,ret out number)
  2  AS LANGUAGE java
  3  NAME 'Test.kasan(int,int,int[])'
  4  ;
  5  /

プロシージャが作成されました。
SQL> CREATE OR REPLACE FUNCTION kasanf(a in number,b in number)
  2  RETURN NUMBER
  3  IS LANGUAGE java
  4  NAME 'Test.kasan(int,int) return int'
  5  ;
  6  /

ファンクションが作成されました。

PL/SQLでオーバーロード(既にプロシージャーで使われている名前を関数で使用)することは出来ない。
やろうとすると、以下のようなエラーになる。

SQL> CREATE OR REPLACE FUNCTION kasan(a in number,b in number)
  2  RETURN NUMBER
  3  IS LANGUAGE java
  4  NAME 'Test.kasan(int,int) return int'
  5  ;
  6  /
CREATE OR REPLACE FUNCTION kasan(a in number,b in number)
*
行1でエラーが発生しました。:
ORA-00955: すでに使用されているオブジェクト名です。

使用方法

あとは、普通のPL/SQLの関数/プロシージャー呼び出しと同じに扱える。

SQL> set serveroutput on
SQL> DECLARE
  2  	a INTEGER;
  3  BEGIN
  4  	kasan(1,2,a);
  5  	DBMS_OUTPUT.PUT_LINE(a);
  6  END;
  7  /
3

PL/SQLプロシージャが正常に完了しました。
SQL> SELECT kasanf(1,2) FROM DUAL;

KASANF(1,2)
-----------
          3

Javaソースの参照方法

user_sourceビューを使ってソースが見られる。[2005-05-15]

SQL> select text from user_source
  2  where name='JAVA_TEST_SRC'
  3  order by line;

TEXT
--------------------------------------------------------------------------------
import java.util.*; //不要

public class Test{

 public static void kasan(int a,int b,int[] ret){
  ret[0]=a+b;
 }

 public static int kasan(int a,int b){
  return a+b;
 }

}

13行が選択されました。

DBMS_METADATA.GET_DDL


Javaソースの削除方法

DBに登録したJavaソースを削除するには、以下のコマンドをSQL*Plusから実行すればよい。

SQL> DROP JAVA SOURCE "JAVA_TEST_SRC";

Javaが削除されました。
SQL> DROP JAVA SOURCE java_test_src;

Javaが削除されました。

CREATE OR REPLACE JAVA SOURCE NAMED java_test_src」で作った時は小文字で指定していても、Oracleの機能で暗黙に大文字に変換されるため、DROP時には大文字で指定する。

特にファイルから作った場合は「Test」の様に大文字小文字が区別されて定義されるので、ダブルクォーテーションは必須。

SQL> DROP JAVA SOURCE "Test";

Javaが削除されました。

SQLメモへ戻る / Javaへ行く / Oracle目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま