【问题标题】:How to configure MyBatis mapper for cursor as an output parameter?如何为光标配置 MyBatis 映射器作为输出参数?
【发布时间】:2017-01-20 09:16:08
【问题描述】:

Oracle 存储过程:

create or replace PROCEDURE "TGT_MPD_PLANOGRAM_SEL_SP" (
    POG_NUM_IN IN VARCHAR2,
    PLAN_DATA_SEL_CUR OUT SYS_REFCURSOR,
    SQL_CODE_OUT OUT NUMBER,
    SQL_ERR_MSG_OUT OUT VARCHAR2)
AS
...

映射器.xml

<select id="getPlanograms" statementType="CALLABLE"
        parameterType="com.tgt.snp.pog.vo.PlanogramSearchVO"
        resultMap="mapResultPlanogram">
    {
        CALL TGT_MPD_PLANOGRAM_SEL_SP(
            #{POG_NUM_IN,javaType=String,jdbcType=VARCHAR,jdbcTypeName=VARCHAR2,mode=IN},
            #{PLAN_DATA_SEL_CUR,jdbcType=CURSOR,resultMap=mapResultPlanogram,mode=OUT},
            #{SQL_CODE_OUT,javaType=Integer,jdbcType=INTEGER,jdbcTypeName=INTEGER,mode=OUT},
            #{SQL_ERR_MSG_OUT,javaType=String,jdbcType=VARCHAR,jdbcTypeName=VARCHAR2,mode=OUT}
        )
    }
</select>

VO 对象

public class PlanogramSearchVO {

    public PlanogramSearchVO(){}
public String getPOG_NUM_IN() {
        return POG_NUM_IN;
    }

    public void setPOG_NUM_IN(String POG_NUM_IN) {
        this.POG_NUM_IN = POG_NUM_IN;
    }

    private String POG_NUM_IN;

    public ResultSet getPLAN_DATA_SEL_CUR() {
        return PLAN_DATA_SEL_CUR;
    }

    public void setPLAN_DATA_SEL_CUR(ResultSet PLAN_DATA_SEL_CUR) {
        this.PLAN_DATA_SEL_CUR = PLAN_DATA_SEL_CUR;
    }

    private ResultSet PLAN_DATA_SEL_CUR;

    public Integer getSQL_CODE_OUT() {
        return SQL_CODE_OUT;
    }

    public void setSQL_CODE_OUT(Integer SQL_CODE_OUT) {
        this.SQL_CODE_OUT = SQL_CODE_OUT;
    }

    private Integer SQL_CODE_OUT;

    public String getSQL_ERR_MSG_OUT() {
        return SQL_ERR_MSG_OUT;
    }

    public void setSQL_ERR_MSG_OUT(String SQL_ERR_MSG_OUT) {
        this.SQL_ERR_MSG_OUT = SQL_ERR_MSG_OUT;
    }

    private String SQL_ERR_MSG_OUT;
}

错误信息

Caused by: org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: java.sql.SQLException: Non supported SQL92 token at position: 1: 
### The error may exist in class path resource [PlanogramMapper.xml]
### The error may involve com.tgt.snp.pog.mapper.PlanogramMapper.getPlanograms-Inline
### The error occurred while setting parameters
### SQL: {           ?,           ?,           ?            = CALL TGT_MPD_PLANOGRAM_SEL_SP(             ?                        )         }
### Cause: java.sql.SQLException: Non supported SQL92 token at position: 1: 
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17034]; Non supported SQL92 token at position: 1: ; nested exception is java.sql.SQLException: Non supported SQL92 token at position: 1: 

请帮忙指出我做错了什么?提前致谢。

【问题讨论】:

    标签: oracle stored-procedures cursor mybatis


    【解决方案1】:

    &lt;select&gt; 元素不需要resultMap 属性,因为它没有在这里使用:调用没有参数的过程,即使它们是游标/结果集,也不是 SELECT

    您可能需要在参数定义中指定 java 类型作为结果集:

    #{PLAN_DATA_SEL_CUR, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=mapResultPlanogram, mode=OUT}
    

    如果结果映射mapResultPlanogram 将游标结果映射到Planogram 对象,则PlanogramSearchVO 类中的属性PLAN_DATA_SEL_CUR 不能是java.sql.ResultSet,而是类似于List&lt;Planogram&gt;

    Mybatis 正在做将 resultSet/Cursor 获取/映射到对象列表的工作;缺点是只有在完全获取光标时才返回控件:没有自定义结果处理、延迟/差异加载……我有answered another question about this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      相关资源
      最近更新 更多