【问题标题】:Groovy Oracle Stored Proc - invaid column indexGroovy Oracle Stored Proc - 无效的列索引
【发布时间】:2017-03-02 17:19:19
【问题描述】:
sql.call("StoredProcName", [Sql.resultSet(OracleTypes.CURSOR)]) { table ->
        table.eachRow { row->
            println row
        }
    }

编辑 这段代码给我一个invalid column index

此代码看起来与我在网上看到的示例相同。我错过了什么?我不能在光标上执行 eachRow 吗?这是我的过程

Create or Replace Procedure StoredProcName(cursor_ OUT SYS_REFCURSOR)
as
Begin
Open cursor_ For
Select blahblahblah

【问题讨论】:

  • 你试过resultSetdocumentation中的大写S吗
  • 谢谢蒂姆!我已经更新了我的问题,我认为这是一个更好的问题,因为你修复了我的语法错误。

标签: oracle jdbc groovy


【解决方案1】:

以下代码可以帮助您从Oracle匿名块中获取SYS_REFCURSOR的变量。

我们应该关注几个关键细节:

  1. groovy.sql.Sql 类没有对应的OutParameter,我们手动将其设为CURSOR_PARAMETER 并将其传递给sql.call 方法
  2. 请考虑该块以{call DECLARE 开头并以END } 结尾,END 后没有分号。否则我们会得到一个难以识别的SQLException
  3. sqlString 中的问号? 是参数绑定的位置。绑定以自然顺序从parametersList 获取值。
    • 在这个例子中,我们有唯一的绑定,所以? 与CURSOR_PARAMETER 绑定,将值视为传递类型的OUT 参数;
  4. sql.callResultSet rs 提供匿名块中声明的游标行my_cur 后只有一个进入关闭。
  5. 我们可以通过使用返回SYS_REFCURSOR 的函数而不是带有OUT 参数的过程来简化sqlString。所以它可能看起来像这样 "{call BEGIN ? := MY_FUNC(); END}" 甚至 "{? = call MY_FUNC()}"

import groovy.sql.OutParameter
import groovy.sql.Sql
import oracle.jdbc.OracleTypes

import java.sql.ResultSet

def driver = 'oracle.jdbc.driver.OracleDriver'
def sql = Sql.newInstance('jdbc:oracle:thin:@my-server:1521:XXX', 'usr', 'psw', driver)

// special OutParameter for cursor type
OutParameter CURSOR_PARAMETER = new OutParameter() {
    public int getType() {
        return OracleTypes.CURSOR;
    }
};

// look at some ceremonial wrappers around anonymous block
String sqlString = """{call
    DECLARE
      my_cur SYS_REFCURSOR;
    BEGIN
        STORED_PROCEDURE_NAME(my_cur);
        ? := my_cur;
    END
}
""";

// the order of elements matches the order of bindings
def parametersList = [CURSOR_PARAMETER];


// rs contains the result set of cursor my_cur
sql.call(sqlString, parametersList) { ResultSet rs ->
  while (rs.next()) {
      println rs.getString("my_column")
  }
};

附:谢谢你的问题。

【讨论】:

  • 太棒了,你是救生员!
  • 也可以写得简洁一点,像这样 sql.call(sqlString, [Sql.out(OracleTypes.CURSOR)])
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多