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

8

我对JDBC很新,一直在尝试着使用它。论坛中的其他帖子指出Oracle的JDBC驱动程序不支持Oracle PLSQL布尔类型。我觉得这真的很奇怪:

Oracle JDBC文档来看,似乎支持:

enter image description here

但在另一节中,它说它不允许将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”接受null值,而Java的原始类型“boolean”不接受吗?
但反驳的是,Java的包装类“Boolean”确实接受null值。这可以用来映射到PL/SQL的布尔类型。有人可以更详细地解释一下吗?

有先例表明,你得到的是一个整数而不是布尔值,但请展示一下你写的代码以获取这个错误。 - Makoto
如果是@Makato提到的情况,请将属性“hibernate.dialect”的值从“org.hibernate.dialect.OracleDialect”更改为“org.hibernate.dialect.Oracle9iDialect”。 - RBz
4个回答

5

来源:PL/SQL TABLE、BOOLEAN 和 RECORD 类型

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

当我在实体中使用布尔值时,遇到了同样的错误。通过将Oracle方言从'org.hibernate.dialect.OracleDialect'更改为'org.hibernate.dialect.Oracle10gDialect'来解决问题。


0

-1

Java使用ResultSetCallableStatement上的wasNull方法支持原始值的null值,因此没有不支持BOOLEAN的理由。

然而,您链接的文档表示它不受支持。您可以尝试使用Oracle特定扩展。该文档还链接到一个示例解决方法(用于参数传递,但是OUT的类比很容易推断)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接