2012-02-02 41 views
2

我想调用Oracle中的一个函数来截断我传入的表名。 不幸的是,我不断收到以下错误,并且不知道为什么。从Groovy Sql调用函数

WARNING: Failed to execute: {? = call trunc_table(?)} because: Invalid column type 
java.sql.SQLException: Invalid column type 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:209) 
    at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3462) 
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:126) 
    at oracle.jdbc. 

我能够从表中选择行并打印到控制台。另外,我可以毫无问题地调用dbms_utility.get_time()函数。

这里是违规的代码。

 def storedProcCall = 
     """{? = call trunc_table(?)}""" 
    sql.call(storedProcCall, [Sql.BOOLEAN, 'YFS_ZIP_CODE_LOCATION']) 
    { 
    println it 
    } 

我希望能找回真或假找出如果函数成功

create or replace 
FUNCTION     TRUNC_TABLE 
(table_name IN VARCHAR2) RETURN BOOLEAN 
IS 

cid INTEGER; -- Cursor ID. 

BEGIN 

cid := DBMS_SQL.OPEN_CURSOR; 

DBMS_SQL.PARSE(cid, 'TRUNCATE TABLE ' || table_name, dbms_sql.native); 


DBMS_SQL.CLOSE_CURSOR(cid); 

RETURN TRUE; 

EXCEPTION 
WHEN OTHERS THEN 
DBMS_SQL.CLOSE_CURSOR(cid); 
dbms_output.put_line('Error truncating table: '||table_name); 
dbms_output.put_line(SQLERRM); 
RETURN FALSE; 
END TRUNC_TABLE; 

回答

7

的问题是,布尔在Oracle中只有PL/SQL的范围内,存在所以它不会绑定回JDBC变量。

我拿了你的函数代码,作出返回类型NUMBER,返回0表示为false,返回1表示为true。然后我打电话这样的:

import groovy.sql.*; 
import java.sql.*; 
sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger", "oracle.jdbc.driver.OracleDriver"); 
sql.call("{? = call TRUNC_TABLE(?)}", [Sql.NUMERIC, "FOO"]) { result -> 
    println result; 
} 

结果是1有一个良好的表,0代表不存在的表(或,据推测,在功能执行任何错误)。

+0

完美的工作!非常感谢! – Carl 2012-02-02 19:22:48

+0

NP!你能标记答案完整吗? – Nicholas 2012-02-02 20:10:03

+0

是的,再次感谢你。 – Carl 2012-02-03 17:53:44