PL/SQL以外のストアドプロシージャ その3
Javaストアドからデータベースにアクセスする処理を紹介します。
下準備としてアクセスするためのテーブルを用意します。 2つカラム(COL1とCOL2)を持った単純なテーブルです。
CREATE TABLE JAVATEST
( COL1 VARCHAR2(50),
COL2 VARCHAR2(50) )
このテーブルにJavaストアドを介してデータを挿入(INSERT)する処理を実装してみます。Javaソースはこんな感じ。(InsertTable.java)
import java.sql.*;
public class InsertTable {
public static void javaTest(String col1, String col2)
{
Connection conn = DriverManager.getConnection("jdbc:default:connection:");
String sql = "insert into javatest (col1,col2) values (?,?)";
try
{
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,col1);
pstmt.setString(2,col2);
pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException e)
{
System.err.println(e.getMessage());
}
}
}
記述としてはごくごく普通のデータベースアクセス用のコードです。 Connectionオブジェクトをconnという名前で作り、connにSQLを登録。 2つの引数を順にCOL1とCOL2に格納するINSERT文を構築して実行します。
注目すべき点は2つ。
Oracle Databaseにアクセスするためのドライバが必要ありません。Oracleのドライバをimportしていませんし、クラスをロードする記述も一切ありません。
Database接続用の文字列を記述する必要がありません。通常であれば、jdbc:○○…のような感じで接続文字列を何らかの方法で用意する必要がありますが、("jdbc:default:connection:")と記述すればJavaクラスを登録したインスタンス・スキーマへのアクセスと読み替えてくれます。
引き続きOracle Databaseへの登録です。
loadjava -user DBUSER/DBPASS@ORCL InsertTable.java
として、エラーが返ってこなければ登録完了です。
登録したJavaクラスを呼ぶPL/SQLを用意します、今回は戻り値voidつまり戻り値が無いメソッドを作りましたのでPL/SQLも戻り値が無いプロシージャで用意します。
CREATE OR REPLACE PROCEDURE INS_JAVATEST (col1 Varchar2,col2 VARCHAR2)
AS LANGUAGE JAVA
NAME 'InsertTable.javaTest(java.lang.String,java.lang.String)';
/
これで、INS_JAVATESTプロシージャが用意できました。このプロシージャは引数2つ、col1を第1引数、col2を第2引数としてjavaTestメソッドに橋渡ししてくれます。
プロシージャなのでSELECT文では実行できません、SQL*PLUS等でCALLして実行してみます。
SQL> call ins_javatest('123','abc');
コールが完了しました。
引き続きテーブルを見てみると・・・
SQL> select * from javatest;
COL1 COL2
----- ----
123 abc
はい、123とabcがそれぞれCOL1,COL2に挿入されました。 ※デフォルトではcommitされないので、commitかrollbackするかJavaメソッド内でconn.commit();とかしておく必要があります。
PL/SQL→JVM→JDBCと繋がってデータがインサートされました。 処理のわりには面倒ですが、使いどころとしてはPL/SQLでは記述が難しいような複雑な条件でデータを更新・削除するような処理…でしょうか。
それとJDBCドライバを介すわけですから、ドライバさえあればどこのデータへもアクセスできます。Oracle DatabaseにアクセスしつつExcelファイルやSQL Serverにデータを書き込んだり、読み込んだりもできますので、うまく使えば協力な武器になりそうです。(クラスパスにドライバ必要)