2013-03-11 56 views
0

在常规教程中:http://groovy.codehaus.org/Database+features使用GString变体从常规调用存储过程

有关于过程的部分。当我尝试这个例子:

The same example again but with a GString variation: 

def first = 'Sam' 
sql.call("{$Sql.VARCHAR = call FullName($first)}") { name -> 
    assert name == 'Sam Pullara' 
} 

我得到异常:

Chyba: ORA-06550: line 1, column 13: 
PLS-00222: no function with name 'FULLNAME' exists in this scope 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

java.sql.SQLException: ORA-06550: line 1, column 13: 
PLS-00222: no function with name 'FULLNAME' exists in this scope 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113) 

是的,这是真的什么例外,因为说我只是过程FULLNAME我想打电话给没有功能是什么。本教程仍然是实际的吗?

+0

尝试使用不同的数据库。我的猜测是Oracle是问题所在。 – cdeszaq 2013-03-12 14:00:31

回答

0
import groovy.sql.Sql 
import oracle.jdbc.driver.OracleTypes 

Sql sql = Sql.newInstance("jdbc:oracle:thin:@hostname:1521:dbname", "username","password","oracle.jdbc.driver.OracleDriver") 
dept_id = 50 

sql.call('{? = call FullName(?)}', [Sql.VARCHAR, 'Sam']) { name-> 
    println name 
} 
1

在Oracle中,存储过程不能返回值,而函数可以返回一个值。这就是你得到这个错误的原因。您可以验证使用我的测试存储过程和常规代码...

CREATE OR REPLACE PROCEDURE test_procedure 
(string_in IN OUT VARCHAR2) IS 
BEGIN 
string_in := 'hi ' || string_in ; 
END; 

import groovy.sql.Sql 

Sql sql = Sql.newInstance("jdbc:oracle:thin:@hostname:1521:dbname", username","password","oracle.jdbc.driver.OracleDriver") 

def first="Wade" 
sql.call '{call test_procedure(?)}', 

    [Sql.inout(Sql.VARCHAR(first))], 
    { test -> 
     println ">>" + test + "<<"; // >>hi Wade<< 
    }