2017-02-28 60 views
1
sql.call("StoredProcName", [Sql.resultSet(OracleTypes.CURSOR)]) { table -> 
     table.eachRow { row-> 
      println row 
     } 
    } 

编辑 的代码块抛出我invalid column indexGroovy的甲骨文存储过程 - invaid列索引

此代码看起来一样,我已经在网上看到的例子。我错过了什么?我不能在游标上做每行吗?这里是我的PROC

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

您是否像[文档](http://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html#resultSet-int- ) –

+0

谢谢Tim!我已经更新了我的问题,我认为现在是一个更好的问题,因为您修复了我的语法错误。 – Steve

回答

1

下面的代码可以帮助你从甲骨文匿名块得到的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的函数,可以简化sqlString,该函数不带OUT参数的过程。因此,它可能看起来像这样"{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") 
    } 
}; 

附:并感谢您的问题。

+0

太棒了,你是一个救星! – Steve

+0

它也可以写得更简洁一点,就像这样: sql.call(sqlString,[Sql.out(OracleTypes.CURSOR)]) – Steve