JDBCからストアドプロシージャを実行しDBMS_OUTPUTの出力を取得
以下例では、ストアドプロシージャでの標準出力を一時的にバッファリングするサイズを2メガ『DBMS_OUTPUT.ENABLE(2000000)』に指定していますが、2000バイト~無制限の間で指定可能です。但し最大行サイズは32767バイトまでです。パラメータ省略した場合(DBMS_OUTPUT.ENABLE())はデフォルトの20000バイトが採用されます。
package jdbcSample; import java.sql.CallableStatement; import java.sql.SQLException; public class ProcedureExecutor { public ProcedureExecutor(Database db) { this.db =db; } Database db = null; void execute(String procedure,int para1,int para2) { CallableStatement css = null; try { enableDbmsOutput(); String sql = "BEGIN %s(?,?);END;"; css = db.conection().prepareCall(String.format(sql, procedure)); css.setInt(1, para1); css.setInt(2, para2); css.executeQuery(); dispDbmsGetLine(); } catch (SQLException e) { e.printStackTrace(); } } /** * * @throws SQLException */ private void enableDbmsOutput() throws SQLException { CallableStatement css = null; // プロシージャから標準出力する際のバッファサイズの指定 String sql = "BEGIN DBMS_OUTPUT.ENABLE(2000000); END;"; css = db.conection().prepareCall(sql); css.execute(); } /** * * @throws SQLException */ private void dispDbmsGetLine() throws SQLException { String sql = "BEGIN DBMS_OUTPUT.GET_LINE(?,?); END;"; CallableStatement cs = db.conection().prepareCall(sql); cs.registerOutParameter(1, java.sql.Types.VARCHAR); cs.registerOutParameter(2, java.sql.Types.INTEGER); while (true) { cs.execute(); if (cs.getInt(2) == 0) { System.out.println(cs.getString(1)); } else { break; } } } }
実行例
上記サンプルプロシージャはこちらです。
ユーザ定義例外発生! INSERT件数:6
rollbackしました