上記の @mtk からの回答よりも明確にするには、次のように変更してみてください。
sql.call("{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}"){}
に:
sql.call(GString.EMPTY + "{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}"){}
最初の試行は機能しません - これはプロシージャの名前をバインドしようとしています。次の形式の SQL が生成されます。
{ call ?.NAME_PROCEDURE(?,?,?) }
2 番目のものは少しわかりにくいです。Groovy SQL は GString オブジェクトを使用して SQL とバインドリストを生成します。ただし、生の文字列で開始するため、式の結果は生の文字列になるため、sql.call に渡される内容は次のようになります。
{ call schema.NAME_PROCEDURE(par1,par2,par2) }
いいえ:
{ call schema.NAME_PROCEDURE(${par1},${par2},${par3}) }
それはあなたが本当に欲しいものです。par1-3 がすべて数値である場合、これで問題ありませんが、文字列 (または置換によって文字列に強制される他の型) の場合、これはおそらく有効な SQL ではないため、SQL 例外です。
基本的に String + GString = String です。Groovy SQL は、このクエリに対してバインド リストを正しく設定できるように、GString インスタンスを想定しています。
文字列を強制的に「GString」インスタンスにすることで、これを回避できます。GString は、GString + String = GString として定義されます。これは、groovy コンソールで確認できます。
groovy> def par1 = 1
groovy> def par2 = 2
groovy> def par3 = 3
groovy> def schema = 'myschema'
groovy> println (("{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}").class)
groovy> println ((GString.EMPTY + "{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}").class)
class java.lang.String
class groovy.lang.GString$2
「{call」を強制的に GString インスタンスにすることで、これが「plus」呼び出しに沿ってカスケードされるため、Groovy SQL が「正しい」バインド リスト/SQL を作成するために必要な入力を確実に取得できるようになります。