为什么Oracle的JDBC驱动不支持Oracle的Boolean类型

Chi*_*led 7 java oracle boolean exception jdbc

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

oracle jdbc 文档来看,它似乎是这样的:

在此处输入图片说明

但是在另一部分中它说它不允许将 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)
Run Code Online (Sandbox Code Playgroud)

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

但与之相反的是,Java 的包装类"Boolean"确实接受空值。这可用于映射到 PLSQL 的 Boolean 类型。有人可以对此多加说明。

小智 5

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

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

...

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