在java中调用oracle PL/SQL函数-列类型无效错误

在java中调用oracle PL/SQL函数-列类型无效错误,java,jdbc,Java,Jdbc,我想从java类调用一个plsql函数,但该函数(isValidPeriod)返回一个布尔数据类型,JDBC不支持它 由于OCI层的限制,JDBC驱动程序不支持 将布尔参数传递给PL/SQL存储过程。这个 java布尔类型与PL/SQl布尔类型不匹配。这个 Oracle文档表明BOOLEAN仅为PL/SQL类型,并且 “java.lang.Boolean”类和 PL/SQL布尔数据类型 因此,我担心您可能必须更改数据库PL/SQL函数以返回整数 或 只需创建一个包装器:函数isValidPeri

我想从java类调用一个plsql函数,但该函数(isValidPeriod)返回一个布尔数据类型,JDBC不支持它

由于OCI层的限制,JDBC驱动程序不支持 将布尔参数传递给PL/SQL存储过程。这个 java布尔类型与PL/SQl布尔类型不匹配。这个 Oracle文档表明BOOLEAN仅为PL/SQL类型,并且 “java.lang.Boolean”类和 PL/SQL布尔数据类型

因此,我担心您可能必须更改数据库PL/SQL函数以返回整数


只需创建一个包装器:
函数isValidPeriodInt()返回的整数是begin-end

该限制有一个简单的解决方法,不需要包装函数,只需将布尔函数本身包装在
CASE
语句中,并使用整数进行绑定:

stmt = conn.prepareCall(
          "BEGIN"
        + " ? := CASE WHEN (myBooleanFuncInOracle()) "
        + "       THEN 1 "
        + "       ELSE 0"
        + "      END;"
        + "END;");

stmt.registerOutParameter(1, Types.INTEGER);

// exec
stmt.execute();

// get boolean from Integer
boolean myBool = (stmt.getInt(1) == 1);

如果您不能或不想更改函数,甚至不能创建包装函数,例如在旧版DBs中,这非常有用。

从JDBC精简驱动程序的12.2版本开始,本机支持PLSQL布尔类型

对于IN参数,您可以执行以下操作:

CallableStatement cstmt = conn.prepareCall(sql);
// Make the driver send the Java "false" boolean as a PLSQL BOOLEAN type:
cstmt.setObject(2, false, OracleTypes.PLSQL_BOOLEAN);
...
cstmt.execute();
...
对于OUT参数,您可以执行以下操作:

CallableStatement cstmt = conn.prepareCall(sql);
// The driver should expect a PLSQL BOOLEAN type for the first OUT argument
// of the PLSQL procedure:
cstmt.registerOutParameter(1, OracleTypes.PLSQL_BOOLEAN);
cstmt.execute();
...
boolean likeTrump = cstmt.getBoolean(1);

可能会有帮助。是的,这可能是一个解决方法。谢谢您如果该函数在其他地方使用,并且您无法更改它,只需创建一个包装器:
函数isValidPeriodInt()返回整数是begin-end我认为这是更好的解决方案,因为您不必修改数据库。