2013-06-18 124 views

回答

4

由于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;

+1

如果该函数用于其他地方,你不能改变它,只需创建一个包装:函数isValidPeriodInt()返回整数是开始<调用isValidPeriod并返回1为true,0为false> end;' –

+0

+1 @KlasLindbäck让我把它添加到答案 –

4

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

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

如果你不能或不想改变你的函数甚至不能创建一个包装函数,即在遗留数据库中,这将非常有用。

+0

我认为这是更好的解决方案,因为您不必修改数据库。 – miracle173

相关问题