如何映射返回CURSOR的Oracle函数的select查询

时间:2014-07-14 21:27:39

标签: java oracle cursor mybatis ibatis

我有一些Oracle函数返回SYS_REFCURSOR:

CREATE OR REPLACE FUNCTION SOME_PKG.SOME_FUNCION ()
   RETURN SYS_REFCURSOR
AS
   REF_TEST   SYS_REFCURSOR;
BEGIN
   OPEN REF_TEST FOR
      SELECT COLUMN_ID, COLUMN_NAME
        FROM SOME_TABLE;
   RETURN REF_TEST;
END;

Java bean:

public class Product {

    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Java映射器接口:

public interface ProductMapper {
    List<Product> getAll();
}

ProductMapper.xml:

...
<resultMap id="productResults" type="Product">
    <result property="id" column="COLUMN_ID" />
    <result property="name" column="COLUMN_NAME" />
</resultMap>

<select id="getAll" resultMap="productResults">
    select SOME_PKG.SOME_FUNCION from dual
</select> 

如果我执行SQL查询&#34;从双&#34;中选择SOME_PKG.SOME_FUNCION。手动返回3条记录

致电&#34; getAll&#34;方法我收到List只有一个null元素。

我正在使用MyBatis 3.2.3

我该怎么做才能得到正确的结果?

1 个答案:

答案 0 :(得分:1)

如果您不期望的结果集使用更新标记和调用函数

<update id="getAll" statementType="CALLABLE">
        { #{holder.products, jdbcType=CURSOR, mode=OUT, resultMap=productResults, javaType=java.sql.ResultSet} = call SOME_PKG.SOME_FUNCION() }
</update>

但由于产品是一个OUT参数,它应该作为一个传递,很可能你必须修改映射器

public class Holder {
    public List<Products> products;
}

public class Mapper {
    void getAll(Holder holder);
}