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;
}
}
}
}
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;
}
}
}
}
実行例
上記サンプルプロシージャはこちらです。