4

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

4

3 回答 3

9

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

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);

如果您不能或不想更改您的函数,甚至不能创建包装函数(即在遗留数据库中),这将非常有用。

于 2014-04-16T07:07:07.527 回答
6

从 12.2 版本的 JDBC-thin 驱动程序开始,对 PLSQL BOOLEAN 类型提供了原生支持。

对于 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);
于 2019-03-29T08:59:14.213 回答
5

由于 OCI 层的限制,JDBC 驱动程序不支持将 BOOLEAN 参数传递给 PL/SQL 存储过程。java 布尔类型与 PL/SQl 布尔类型不匹配。Oracle 文档指出 BOOLEAN 只是 PL/SQL 类型,“java.lang.Boolean”类和 PL/SQL BOOLEAN 数据类型之间没有映射。

所以恐怕你可能不得不改变你的数据库 PL/SQL 函数来返回一个整数

或者

只需创建一个包装器:function isValidPeriodInt(<params>) return integer is begin <call isValidPeriod and return 1 on true, 0 on false> end;

于 2013-06-18T06:54:29.977 回答