使用 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");
也在设置对象名称。
我正在尝试使用 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
的解决方案描述为
以下是使用(部分)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");
也在设置对象名称。