我想从 java 类调用一个 plsql 函数,但该函数(isValidPeriod)返回一个布尔数据类型,而 JDBC 不支持它
问问题
5153 次
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 回答