我有一个Oracle Stored Procedure的iBatis映射,它返回一个true / false值。
<resultMap id="isAuthorizedResult" class="java.lang.Boolean">
<result property="isAuthorized" column="isAuthorized"/>
</resultMap>
<parameterMap id="isAuthorizedCall" class="map">
<parameter property="prgType" jdbcType="String" javaType="java.lang.String" mode="IN"/>
<parameter property="parCode" jdbcType="String" javaType="java.lang.String" mode="IN"/>
<parameter property="userId" jdbcType="String" javaType="java.lang.String" mode="IN"/>
<parameter property="Result0" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="isAuthorizedResult"/>
</parameterMap>
<procedure id="isAuthorized" parameterMap="isAuthorizedCall">{call chk_user_ocpncy (?,?,?,?) }</procedure>
我从我的Java代码中调用映射,如下所示:
getSqlMapClientTemplate().queryForObject("reexamination.isAuthorized", paramMap);
但是,我收到以下错误...
Fail to convert to internal representation; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:
我做错了什么?我们不能直接将一个布尔值存储到游标中吗?
答案 0 :(得分:4)
返回布尔类型为not supported by Oracle JDBC。或者更具体地说,它不能在Oracle的任何结果集中使用(有一个可以在PL / SQL中使用的布尔值,但是你不能在ref游标中返回它或声明一个类型为'Boolean的列'。
听起来你说你的引用游标包含布尔值?如果是,您将需要返回'Y'或'N'或类似的东西。请考虑发布存储过程的源/签名 - 这将有助于解答。
http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.html#34_05
Tom Kyte的传统厚脸皮response: 你问过
这是一个真正的短片汤姆:
为什么Oracle RDBMS没有 布尔数据类型?
我们说...
因为...,标志字符char(1)检查(标志输入 ('Y','N')),...,
服务于同一目的,需要 相同数量的空间并做同样的事情 事 - 我想我们觉得这是一个 功能我们可以让他们拥有我们 真的不需要。
我的意思是 - 你从什么回来了 “访问”中的一列是一个布尔值? 真假。我们会给你Y / N - 如果您想要TRUE / FALSE,我们可以 用它轻松完成 DECODE(标志, 'Y', 'TRUE', 'N', 'FALSE')