Oracleの独自言語のPL/SQLから、Javaで書いたプログラムを呼び出すことが出来る。
|
JavaのソースをDB内の専用の場所に取り込み、それをPL/SQLで呼び出せる形式にして使う。
なお、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
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行が選択されました。
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が削除されました。