在java中调用oracle PL / SQL函数 – 无效的列类型错误

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

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

因此,我担心您可能必须更改数据库PL / SQL函数以返回整数

要么

只需创建一个包装器: function isValidPeriodInt() return integer is begin end;

这个限制有一个简单的解决方法,它不需要包装器函数,只需将布尔函数本身包装在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); 

如果您不能或不想更改function甚至无法创建包装函数(例如在旧版DB中),则非常有用。