尝试使用命名参数来调用Oracle存储过程。 in参数工作正常,但我似乎无法访问out参数。
测试存储过程的代码位于页面底部。
/* imports and sql connection */
import groovy.util.GroovyTestCase
import groovy.sql.Sql
import lib.*
import java.sql.*
import oracle.jdbc.*
def sql;
this.class.classLoader.rootLoader.addURL(new URL("file:ojdbc7.jar"))
sql= Sql.newInstance ("jdbc:oracle:thin:@......", "..user..", "..password..")
以下示例正常使用?占位符
/*** Example 1 ***/
/* Works fine using ? placeholders */
def greeting
println "**** Example 1 ****\n"
sql.call "{call groovy_test(?,?)}",
[ 'Johny', Sql.VARCHAR ],
{ dbgreeting -> greeting = dbgreeting }
println "greeting: " + greeting
/* Outputs: greeting: hello Johny /*
下一个示例因无效列类型
而失败/*** Example 2 ***/
def greeting2
println "\n**** Example 2 ****\n"
sql.call "{call groovy_test(:myname,:greeting)}",
[ myname:'Johny', greeting:Sql.VARCHAR ],
{ dbgreeting -> greeting2 = dbgreeting }
println "greeting: " + greeting
/* Error
groovy.sql.Sql call
WARNING: Failed to execute: {call groovy_test(:myname,:greeting)} because: Invalid column type
Caught: java.sql.SQLException: Invalid column type
*/
以下示例中没有输出
/*** Exampl 3 ***/
def greeting3
println "\n**** Example 3 ****\n"
sql.execute "{call groovy_test(:myname,:greeting)}",
[ myname:'Johny', greeting:Sql.VARCHAR ],
{ dbgreeting -> greeting3 = dbgreeting }
println "Test3 greeting: " + greeting3
/* Output: greeting: null */
有没有人知道在使用命名表示法时如何访问out参数? 运行更复杂的过程,它们确实获得输入值。这已在表格数据中得到验证。
存储过程代码:
create procedure groovy_test( myname varchar2, greeting out varchar2 )
as
begin
greeting := 'hello ' || myname;
end;
答案 0 :(得分:0)
我是groovy的初学者,所以只是抛出想法FWIW ......
只是预感..考虑将Sql.VARCHAR
更改为类似String的基本数据类型。然后,您始终可以将结果强制转换为您想要的任何类型。
您也可以尝试Sql.LONGVARCHAR
根据Oracle varchar2的版本,可以是4000个字符。可能是Sql.VARCHAR没有处理,但Sql.LONGVARCHAR可以处理它。
你也试过了 sql.execute“{call groovy_test(:myname,:greeting)}”, ['Johny',Sql.VARCHAR], {greeting - > greeting3 = greeting}
最后,根据this占位符必须是?仅