JDBC

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

JDBCからストアドプロシージャを実行しDBMS_OUTPUTの出力を取得

以下例では、ストアドプロシージャでの標準出力を一時的にバッファリングするサイズを2メガ『DBMS_OUTPUT.ENABLE(2000000)』に指定していますが、2000バイト~無制限の間で指定可能です。但し最大行サイズは32767バイトまでです。パラメータ省略した場合(DBMS_OUTPUT.ENABLE())はデフォルトの20000バイトが採用されます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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; } } } }
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しました
スポンサーリンク
タイトルとURLをコピーしました