从Groovy Sql调用函数

Car*_*arl 2 java sql groovy

我试图在Oracle中调用一个函数来截断我传入的表名.不幸的是,我一直得到以下错误,并且不知道为什么.

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.
Run Code Online (Sandbox Code Playgroud)

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

这是违规代码.

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

我希望找回真假,以确定函数是否成功

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;
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 8

问题是Oracle 中的BOOLEAN仅存在于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;
}
Run Code Online (Sandbox Code Playgroud)

对于一个好的表,结果是1,对于一个不存在的表,结果是0(或者,大概是对于函数执行中的任何错误).