2009-11-02 51 views
1

对于Oracle存储过程,我有以下iBatis映射,它返回true/false值。oracle光标的iBatis映射

<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: 

我在做什么错?我们不能直接在光标中存储布尔值吗?

回答

4

返回一个布尔类型是not supported by Oracle JDBC。或者更具体地说,它不能用于Oracle中的任何结果集(有一个布尔值可以在PL/SQL中使用,但不能将其返回到引用游标中或声明为'Boolean'类型的列'

这听起来像你说你的ref cursor包含布尔值?如果是的话,你需要返回'Y'或'N'或类似的东西请考虑发布存储过程的源/签名 - 这将有助于与答案

http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.html#34_05

汤姆凯特的传统厚脸皮response: 你问

这里是一个真正的短单为您汤姆:

为什么不甲骨文RDBMS有 布尔数据类型?

和我们说......

因为......,标志CHAR(1)检查(标志 ( 'Y', 'N')),...,

服务于相同的目的,需要 相同数量的空间,并做相同的 的事情 - 我想我们觉得这是一个 功能,我们可以让他们有我们 真的不需要。

我的意思是 - 你从“访问”中的 列返回的是一个布尔值? 是/否。我们会给你Y/N - 如果您想TRUE/FALSE,我们可以用 DECODE 完成,很容易(旗, 'Y', '真', 'N', '假')