2017-02-28 52 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