To be more explicit than the answer from @mtk above, try changing:
sql.call("{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}"){}
to:
sql.call(GString.EMPTY + "{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}"){}
You first attempt will not work - this is attempting to bind the name of the procedure, it will generate SQL of the form:
{ call ?.NAME_PROCEDURE(?,?,?) }
The second one is slightly less obvious. Groovy SQL uses the GString object to generate SQL and a bindlist. However, because you start with a raw string, the result of the expression will be a raw string, so what is passed to sql.call will look like:
{ call schema.NAME_PROCEDURE(par1,par2,par2) }
Not:
{ call schema.NAME_PROCEDURE(${par1},${par2},${par3}) }
which is what you really want. If par1-3 are all numbers, you would be OK with this, but if they are Strings (or some other type that would be coerced to a string by replacement), this probably isn't valid SQL, hence your SQL exception.
Basically String + GString = String. Groovy SQL is expecting a GString instance so that it can set up the bind list correctly for this query.
You can get around this by forcing the string to be a 'GString' instance. GString is defined such that GString + String = GString. You can see this at the groovy console:
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
By coercing the "{call" to be a GString instance, this will then cascade along the 'plus' invocations, so you can ensure that Groovy SQL gets the input it needs to create the 'correct' bind list/SQL.