【问题标题】:Reading the Output of DBMS_OUTPUT using Groovy使用 Groovy 读取 DBMS_OUTPUT 的输出
【发布时间】:2021-10-18 15:33:49
【问题描述】:

我正在尝试使用 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 语法异常?

【问题讨论】:

  • “我得到异常”“我得到错误” - 什么异常?什么错误?
  • 在 99.99999% 的情况下,使用 dbms_output 将数据返回给调用应用程序是没有意义的。 dbms_output 更像是一个粗略的调试工具。例如,声明一个返回值的函数并从您的客户端调用该函数通常会更有意义。或带有out 参数的过程。
  • 前 3 行不起作用,因为它们是 SQL*Plus 命令,而不是 PL/SQL。我认为它不会解决您的问题,但您可以将 dbms_output.enable(); 移到 begin 之后,它会运行。

标签: java oracle groovy plsql


【解决方案1】:

我遇到错误

构造描述符失败:空对象名

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

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"); 行也在设置对象名称。

【讨论】:

    【解决方案2】:

    如何在JDBC中读取DBMS_OUTPUT的解决方案描述了herehere

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

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多