为什么Oracle的JDBC驱动程序不支持Oracle的布尔类型

时间:2014-11-25 17:08:24

标签: java oracle exception jdbc boolean

我是JDBC新手并且一直在玩它。论坛中的其他帖子表明Oracle的JDBC驱动程序不支持Oracle PLSQL布尔类型。我发现这很奇怪:

oracle jdbc documentation来看似乎是这样:

enter image description here

但在another section中,它表示不允许将BOOLEAN参数传递给PL / SQL存储过程。

文件是否与自身相矛盾?

它不允许我传递或接受来自PL / SQL过程/函数的布尔值。它给了我以下例外:

Exception occured in the database
Exception message: Invalid column type: 16
Database error code: 17004
java.sql.SQLException: Invalid column type: 16
    at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3963)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:135)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:304)
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:393)
    at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1579)
    at com.HrManager.insertNewEmployee(HrManager.java:1300)
    at com.HrManager.main(HrManager.java:1411)

我试图理解为什么JDBC Oracle驱动程序不支持布尔类型。是因为PL / SQL "Boolean"接受空值而Java的原始类型"boolean"不接受?

但与之相反的是,Java的包装类"Boolean"确实接受了空值。这可以用于映射到PLSQL的布尔类型。有人可以对此有所了解。

4 个答案:

答案 0 :(得分:3)

来自:PL/SQL TABLE, BOOLEAN, and RECORD Types

  

Oracle JDBC驱动程序支持调用参数或返回PL / SQL RECORD,BOOLEAN或具有非标量元素类型的表的值是不可行的。但是,Oracle JDBC驱动程序支持标量元素类型的PL / SQL索引表。

     

...

     

作为PL / SQL RECORD,BOOLEAN或非标量表类型的变通方法,创建容器过程,以JDBC支持的类型处理数据。例如,要包装使用PL / SQL boolean的存储过程,请创建一个存储过程,该过程从JDBC获取字符或数字,并将其作为BOOLEAN传递给原始过程,或者对于输出参数,从原始过程接受BOOLEAN参数。过程并将其作为CHAR或NUMBER传递给JDBC。同样,要包装使用PL / SQL记录的存储过程,请创建一个存储过程来处理其各个组件(如CHAR和NUMBER)或结构化对象类型中的记录。要包装使用PL / SQL表的存储过程,请将数据分解为组件或使用Oracle集合类型。

答案 1 :(得分:0)

在这里回答 https://stackoverflow.com/a/55413745/4612499(带有代码示例)Oracle JDBC瘦驱动程序支持从12.2开始的PLSQL BOOLEAN类型。

答案 2 :(得分:0)

在实体中使用布尔值时,我遇到了相同的错误。 通过将oracle方言从“ org.hibernate.dialect.OracleDialect”更改为“ org.hibernate.dialect.Oracle10gDialect”来解决。

答案 3 :(得分:-1)

Java使用wasNullResultSet上的CallableStatement方法支持原始值的空值,因此不支持BOOLEAN

但是,您链接的文档显示为not supported。您可以使用oracle specific extensions。文档还链接到an example workaround(用于参数传递,但OUT的模拟很容易推断)。