2016-09-12 16 views
1

Oracleのストアドプロシージャ:出力パラメータとしてカーソルのMyBatisマッパーを設定する方法は?

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

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

何をディを指摘助けてください私は間違っていますか?前もって感謝します。

答えて

1

それはここでは使用されていないため<select>要素がresultMap属性を必要としない:outパラメータでプロシージャを呼び出し、彼らはカーソル/たresultSetている場合でも、SELECTではありません。

あなたはパラメータ定義で設定され、結果として、Javaの型を指定する必要があります。

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

クラスPlanogramSearchVOの不動産PLAN_DATA_SEL_CURがjava.sql.ResultSetではなく、結果マップmapResultPlanogramマップカーソル場合List<Planogram>のようなものであってはなりません結果はPlanogramオブジェクトになります。

Mybatisは、resultSet/Cursorをオブジェクトのリストにフェッチ/マッピングする作業を行っています。カーソルが完全にフェッチされたときにのみコントロールが返されるという欠点があります。カスタム結果処理、遅延/異なるロードなどはありません... answered another question about thisがあります。

関連する問題