spockでPostgreSQLのストアドのテストをしようとして最初ハマッたのでメモ
sample.groovy
def sql = Sql.newInstance(省略)
// 引数1、2が文字列、引数3がOUTでInteger、引数4がOUTでrefcursorのケース
def s = "{call ストアド名(?, ?, ?, ?)}"
def paras = ["引数1", "引数2", Sql.out(Sql.INTEGER.getType()), Sql.out(Sql.OTHER.getType())]
sql.call(strSql, params) {errorCd, rows->
rows.eachRow {rs->
// 取得結果(hogeカラム)へのアクセス例
def hoge = rs.hoge
}
}
refcursorはSQLタイプとしてOTHERを指定する。
(outがtext[]の場合はARRAYを指定する)
それとrefcursorにアクセスするにはeachRowの中でアクセスしないと
ResultSetは閉じられているという実行時エラーとなる。
pgAdminでこのストアドを使おうとした場合
begin;
ストアド名('引数1', '引数2');
と書いて実行すると<unnamed portal 数値>というのが取ってこれて
fetch all "<unnamed portal 数値>";
とやらないとrefcursorにアクセスできないのと同じ原理だと思う。
ちなみにこのrsをコピーしてeachRowの外で使おうとしても
やっぱりResultSetは閉じられているっていう実行時エラーとなる。
whenで実行してデータを保持しといてthenでassertしたいのだけど
やり方がわからない(´;ω;`)