为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: 8
【问题描述】*:
我先在数据库中创建了一个存储过程:
CREATE OR REPLACE PROCEDURE HELLO_WORLD IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, World!');
END;
然后我通过jdbc的prepareCall 执行 begin HELLO_WORLD(); end; 这个语句可以成功调用存储过程,但是我怎么在调用成功后获取到DBMS_OUTPUT.PUT_LINE的结果?
public class DmDBMSOutput {
public static void main(String[] args) {
String url = "jdbc:dm://localhost:5236/TEST";
Properties props = new Properties();
props.setProperty("user", "SYSDBA");
props.setProperty("password", "SYSDBA");
try (Connection conn = DriverManager.getConnection(url, props)) {
// 启用DBMS_OUTPUT
try (CallableStatement enableStmt = conn.prepareCall("{call DBMS_OUTPUT.ENABLE()}")) {
enableStmt.execute();
}
// 执行存储过程
try (CallableStatement procStmt = conn.prepareCall("{call my_procedure()}")) {
procStmt.execute();
}
// 获取输出 outputs = new ArrayList<>();
List
try (CallableStatement getLineStmt = conn.prepareCall("{call DBMS_OUTPUT.GET_LINES(?, ?)}")) {
getLineStmt.registerOutParameter(1, Types.ARRAY);
getLineStmt.registerOutParameter(2, Types.INTEGER);
getLineStmt.setInt(2, 100); // 最多获取100行
getLineStmt.execute();
Array array = getLineStmt.getArray(1);
if (array != null) {
String[] lines = (String[]) array.getArray();
Collections.addAll(outputs, lines);
}
}
// 打印结果
outputs.forEach(System.out::println);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
参考以上代码