应用参数映射时出现iBatis错误 - 由SQLException引起:光标已关闭

时间:2010-07-15 15:58:27

标签: sql oracle cursor ibatis

我正在调试从通过iBatis for java调用存储过程返回的null ResultMap的问题。这是我收到的例外的截断副本。

DataAccessException: Exception calling procedure
Caused by: com.ibatis.common.jdbc.exception.NestedSQLException: 
--- The error occurred in ibatis-map.xml.  
--- The error occurred while applying a parameter map.  
--- Check the getEmpLoanDistribContribInfoMap.  
--- Check the output parameters (retrieval of output parameters failed).  
--- Cause: java.sql.SQLException: Cursor is closed.

我不相信问题实际上在参数映射中,因为类似的代码在项目的其他区域中起作用,但我在这里包含参数map和存储的proc头以防万一。

<parameterMap id="getEmpLoanDistribContribInfoMap" class="map" >
    <parameter property="resultCode" javaType="int" jdbcType="NUMERIC" nullValue="-1" mode="OUT"/>
    <parameter property="client_id" javaType="int" jdbcType="NUMERIC" mode="IN"/>
    <parameter property="emp_nbr" javaType="int" jdbcType="NUMERIC" mode="IN"/>
    <parameter property="general_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="current_contrib_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="future_contrib_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="distrib_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
    <parameter property="loan_info" javaType="result" jdbcType="ORACLECURSOR" mode="OUT"/> 
</parameterMap>

function get_emp_ldc_info (
  client_id                 employees.clt_id%type,
  emp_nbr                   employees.emp_nbr%type,
  general_info              out retire_ref_types.retire_ref_cursor,
  current_contrib_info      out retire_ref_types.retire_ref_cursor,
  future_contrib_info       out retire_ref_types.retire_ref_cursor,
  distrib_info              out retire_ref_types.retire_ref_cursor,
  loan_info                 out retire_ref_types.retire_ref_cursor
) return number is
  retval number;

打开上面5个光标中的每个光标,以便在函数体内进行选择。我提取了每个选择查询,并且它们都运行正常(虽然有些没有找到任何记录 - 这可能是我的问题吗?)。我甚至创建了一个镜像此函数的脚本,该脚本在声明块中定义每个游标,然后打开它们。没有例外。

我意识到我的问题很可能是糟糕的数据,但我不知道在哪里看。我唯一能想到的是,如果为找不到数据的选项打开参数映射中的一个out游标,我应该得到此异常。有谁知道这是真的吗?

1 个答案:

答案 0 :(得分:2)

我已经确认这是造成这种情况的不良数据。我还没有找到它的位置,但我正在回答这个问题,所以没有人浪费时间在这上面。谢谢你的阅读。