JDBC

DBMS_OUTPUTの出力をJava側で取得する

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しました
スポンサーリンク