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

EDITこのコードのブロックは私にinvalid column indexGroovyのOracleのストアドプロシージャ - invaid列インデックス

このコードを投げている は、私がオンラインに見てきた例と同じように見えます。私は何が欠けていますか?私はeachカーソルを使って行えませんか?ここに私のprocです

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

[documentation](http://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html#resultSet-int-のように、大文字のSで 'resultSet'を試したことがありますか? ) –

+0

ありがとうTim!私はあなたの構文エラーを修正したので私は今より良い質問だと思う、私の質問を更新しました。 – Steve

答えて

1

次のコードは、SYS_REFCURSORの変数をOracleの匿名ブロックから取得するのに役立ちます。

我々はいくつかの重要な詳細に焦点を当てるべきである

  1. クラスgroovy.sql.SqlOutParameter対応する必要がないと我々はCURSOR_PARAMETERとして手動でそれを作ると
  2. は、ブロックが{call DECLAREで始まることを考えてみましょうsql.callメソッドに渡しENDの後にセミコロンなしでEND }で終わります。さもなければ私達は顔のほとんど認識できないSQLExceptionを得ることができます。
  3. sqlStringの中の疑問符?は、パラメータバインディングの場所です。バインドは、parametersListの値を取る自然順序で行われます。
    • この例では、唯一のバインディングしか持っていないため、?は、値をOUTという型の渡された型として扱うCURSOR_PARAMETERとバインドします。
  4. 一つだけsql.call後に閉鎖に入るとResultSet rsが匿名ブロック内で宣言したカーソルmy_curの行を提供があります。
  5. OUTパラメータのプロシージャの代わりにSYS_REFCURSORを返す関数を使用すると、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") 
    } 
}; 

P.S.ようになります。そして、あなたの質問に感謝します。

+0

素晴らしい、あなたは命を救う人です! – Steve

+0

このようにもう少し簡潔に書くこともできます sql.call(sqlString、[Sql.out(OracleTypes.CURSOR)]) – Steve

関連する問題