我想打电话从Java类中的PLSQL功能,但该功能(isValidPeriod)返回一个布尔datat类型和JDBC不支持它调用的Oracle PL/SQL函数 - 无效列类型的错误
回答
由于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;
如果该函数用于其他地方,你不能改变它,只需创建一个包装:函数isValidPeriodInt(
+1 @KlasLindbäck让我把它添加到答案 –
有一个简单的解决方法对于那种不需要包装函数的限制,只需将布尔函数本身包装在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);
如果你不能或不想改变你的函数甚至不能创建一个包装函数,即在遗留数据库中,这将非常有用。
我认为这是更好的解决方案,因为您不必修改数据库。 – miracle173
- 1. PLSQL错误:无效的数字
- 2. JdbcTemplate类的查询参数类型错误:无效列类型
- 3. 无效的SQL类型:sqlKind = UNINITIALIZED - PLSQL错误
- 4. C#调用Oracle函数 - 错误:“空数据无效操作”
- 5. PLSQL错误无效号码
- 6. PLSQL归档LONG数据类型,错误:
- 7. ORACLE PLSQL函数/触发器
- 8. Oracle:在创建表上无效的数据类型错误
- 9. 阵营:类型错误:无法调用类的函数
- 10. 数据库错误:“类型错误:无效的PostgreSQL类型:BIGINT”
- 11. 无效的操作数类型错误
- 12. Oracle:执行过程中抛出无效的数据类型错误ORA-00902:无效的数据类型
- 13. MyBatis Oracle调用PLS-00306:错误的调用参数数量或类型错误
- 14. 访问plsql函数时出错:函数名无效
- 15. 使用Oracle数据泵时PLSQL函数编译错误
- 16. 用于无效参数类型的PLSQL异常处理程序
- 17. 类型错误:调用函数
- 18. mypy“无效类型”错误
- 19. 调用虚函数时继承类“无效指针错误”
- 20. 将Oracle PLSQL函数调用成第二个函数
- 21. 无效类型的下标错误
- 22. 错误:无效的参数类型“无效”
- 23. Oracle数据类型错误
- 24. 编译错误:调用基类型构造函数时无效转换
- 25. Swift - 无效使用'()'调用非函数类型的值'[NSLayoutConstraint]'
- 26. 错误:在R中无效的下标类型'列表'
- 27. 转换无效的错误和无效的类型
- 28. “无效参数类型”错误。 R
- 29. 函数错误的使用无效
- 30. Oracle函数编译错误,无错误
[This](https://forums.oracle.com/thread/938149)可能会有所帮助。 – user75ponic
是的这可以是一种解决方法谢谢 – Prashant