使用 Groovy 读取 DBMS_OUTPUT 的输出

Reading the Output of DBMS_OUTPUT using Groovy

我正在尝试使用 groovy 执行 oracle PL/SQL 过程,但出现异常。据我了解,这是由于这些初始行-

SET SERVEROUTPUT ON
SET FEEDBACK OFF 
execute dbms_output.enable(buffer_time);

我的代码如下所示:

Connection con=DriverManager.getConnection(url,username,password);
def sql= new Sql(con)
String stmt= " SET SERVEROUTPUT ON
SET FEEDBACK OFF 
execute dbms_output.enable(buffer_time);
declare
//some varaibles
begin
//code
dbms.output.put.line(variable)
end
"
sql.execute(stmt);

当我删除前 3 行时,我没有收到任何错误,但不会有任何输出,因为我正在使用 dbms.output.put.line,因此它们是必需的。如何解决从初始行得到的 SQL 语法异常?

如何读取 JDBC 中的 DBMS_OUTPUT 的解决方案描述为 and here

以下是使用(部分)GroovySQL 的改编脚本。

请注意,重要的部分是 dbms_output.get_lines 的调用 - 没有它,您将看不到任何输出。

我使用(普通)JDBC 来调用它,因为它似乎需要 GroovySQL 中的一些扩展来将类型化的 ARRAY 作为 OUT 参数传递 - 参见

def stmt = """begin 
  dbms_output.enable(); 
  dbms_output.put_line('line 1'); 
  dbms_output.put_line('line 2'); 
end;"""
   
sql.execute(stmt)

int arraySize = 100;
def stmt2 = """begin 
  dbms_output.get_lines(?, ?); /* output array, array size */
end;
"""

def cs = con.prepareCall(stmt2)
cs.registerOutParameter(1, Types.ARRAY, "DBMSOUTPUT_LINESARRAY");
cs.registerOutParameter(2, Types.INTEGER);
cs.setInt(2, arraySize);
cs.execute()

def array = cs.getArray(1);

println array.dump()
array.getArray().each {
   println(it)
}

array.free();
cs.close();

返回的数组似乎包含一个额外的元素 null 应该被忽略

name = XXXX.DBMSOUTPUT_LINESARRAY
max length = 2147483647
length = 3
element[0] = line 1
element[1] = line 2
element[2] = null

我遇到错误

Fail to construct descriptor: empty Object name

我不确定应该如何传递对象名称。下面是我的 groovy 电话。

sql.call("{call dbms_output.get_lines(?, ?)}", [Sql.ARRAY, sql.inout(Sql.INTEGER(100))]){
retVal1, retVal2 ->
log.info(retVal2);
}

我认为你的行 cs.registerOutParameter(1, Types.ARRAY, "DBMSOUTPUT_LINESARRAY"); 也在设置对象名称。