我是JDBC新手并且一直在玩它。论坛中的其他帖子表明Oracle的JDBC驱动程序不支持Oracle PLSQL布尔类型。我发现这很奇怪:
从oracle jdbc documentation来看似乎是这样:
但在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的布尔类型。有人可以对此有所了解。
答案 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使用wasNull
和ResultSet
上的CallableStatement
方法支持原始值的空值,因此不支持BOOLEAN
。
但是,您链接的文档显示为not supported。您可以使用oracle specific extensions。文档还链接到an example workaround(用于参数传递,但OUT的模拟很容易推断)。