2007/05/06(日)13:10
Java で Oracle のストアードプロシージャを実行してみる
仕事関連でどうしても必要になり、特に知りたくはなかったが Java から Oracle のストアードプロシージャを実行して結果をうけとる方法を勉強したので、とりあえず備忘録、備忘録。
それで、いきなり結論からいうと、以下のサイト様が役に立ちました。
JDBC-03 CallableStatementを使う。
というころで、私の場合はためしにこんなストアードプロシージャを作ってみました。
CREATE OR REPLACE PROCEDURE TESTSP (
pSql IN VARCHAR2
, pResult OUT NUMBER
, pSqlCode OUT NUMBER
, pSqlMsg OUT VARCHAR2
) IS
BEGIN
pResult:= 12354;
pSqlCode:= 12345;
pSqlMsg:='12345desuyo';
END;
/
えっとえっと、1 つの文字列を引数として、決まった 3 つの値を返すというとっても意味のないものです。ぐはぁ。
Java のソースコードは以下のような感じ(赤字になっているJNDI 関連のお作法コードは WebLogic Server を使った場合のもの)。ま、CallableStatement を使いましょうということですね。
import java.util.*;
import java.sql.*;
import javax.naming.*;
:
Context ctx = null;
Connection conn = null;
CallableStatement cs = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,"t3://localhost:7001");
try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("[DataSource の JNDI 名]");
conn = ds.getConnection();
conn.setAutoCommit(false);
cs = conn.prepareCall("{call TESTSP(1,?,?,?)}");
cs.registerOutParameter(1,java.sql.Types.INTEGER);
cs.registerOutParameter(2,java.sql.Types.INTEGER);
cs.registerOutParameter(3,java.sql.Types.VARCHAR);
cs.execute();
System.out.println("OutParam 1 =" + cs.getInt(1));
System.out.println("OutParam 2 =" + cs.getInt(2));
System.out.println("OutParam 3 =" + cs.getString(3));
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (cs != null) cs.close();
if (conn != null) conn.close();
} catch (Exception sqlex){
sqlex.printStackTrace();
}
}