Java で Oracle のストアードプロシージャを実行してみる
仕事関連でどうしても必要になり、特に知りたくはなかったが Java から Oracle のストアードプロシージャを実行して結果をうけとる方法を勉強したので、とりあえず備忘録、備忘録。それで、いきなり結論からいうと、以下のサイト様が役に立ちました。JDBC-03 CallableStatementを使う。というころで、私の場合はためしにこんなストアードプロシージャを作ってみました。CREATE OR REPLACE PROCEDURE TESTSP ( pSql IN VARCHAR2 , pResult OUT NUMBER , pSqlCode OUT NUMBER , pSqlMsg OUT VARCHAR2) ISBEGIN 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(); } }