存储过程命名为参数

时间:2013-12-13 15:52:32

标签: oracle stored-procedures groovy

尝试使用命名参数来调用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;

1 个答案:

答案 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占位符必须是?仅

价: Call SQL stored procedure with named parameter in Groovy