To do what you're trying to do, you'll need to write a TypeHandler.  iBATIS
doesn't allow ResultSets to leave the execution scope.

Clinton

On Fri, Apr 23, 2010 at 6:20 AM, Alex Park <yjac...@paran.com> wrote:

> Alex Park <yjacket <at> paran.com> writes:
>
> >
> > Hi there,
> >
> > How to get a result from output parameter(oracle cursor).
> > Below is my code and that is not work.
> > Does anyone can help me?
> >
> > Oracle Stored Procedure:
> >
> > CREATE OR REPLACE PROCEDURE getProducts
> > (
> >    rs OUT SYS_REFCURSOR
> > )
> > IS
> > BEGIN
> >    OPEN rs FOR
> >    SELECT * FROM Products;
> > END getProducts;
> >
> > Interface:
> >
> > public interface ProductMapper
> > {
> >    @Select("call getProducts(#{rs,mode=OUT,jdbcType=CURSOR})")
> >    @Options(statementType = StatementType.CALLABLE)
> >    List<Product> getProducts();
> > }
> >
> > DAO:
> >
> > public class ProductDAO
> > {
> >    public List<Product> getProducts()
> >    {
> >        return mapper.getProducts(); // mapper is ProductMapper
> >    }
> > }
> >
> > Error Message:
> > ### Error querying database.
> > Cause: org.apache.ibatis.reflection.ReflectionException:
> > Could not set property 'rs' of
> > 'class org.apache.ibatis.reflection.MetaObject$NullObject' with value
> > 'oracle.jdbc.driver.OracleResultSetImpl <at> 13f210f'
> > Cause: org.apache.ibatis.reflection.ReflectionException:
> > There is no setter for property named 'rs' in 'class java.lang.Class'
> >
> > Thanks,
> > Alex
> >
>
> I try another way but it still not work.
>
> I added @Results annotion into the interface file.
> And set ResultMap ID to "getList-ProductFilter"(I found it via debugging).
> And I added one parameter on getList() method.
>
> Interface:
> public interface ProductMapper
> {
>    @Select("call GETPRODUCTS(#{rs,mode=OUT,jdbcType=CURSOR
>        javaType=ResultSet,resultMap=getList-ProductFilter})")
>    @Results(value={
>        @Result(property="productCode",column="productCode"),
>        @Result(property="productName",column="productName"),
>        @Result(property="publisherCode",column="publisherCode"),
>        @Result(property="swGroupCode",column="swGroupCode"),
>        @Result(property="swType",column="swType"),
>        @Result(property="version",column="version"),
>        @Result(property="licenseType",column="licenseType"),
>        @Result(property="price",column="price")
>    })
>    @Options(statementType = StatementType.CALLABLE)
>    List<Product> getList(ProductFilter filter);
> }
>
> ProductFilter:
> public class ProductFilter
> {
>    private ResultSet rs;
>
>    public ResultSet getRs() {
>        return rs;
>    }
>
>    public void setRs(ResultSet rs) {
>        this.rs = rs;
>    }
> }
>
> DAO:
> public List<Product> getList()
> {
>    return mapper.getList(new ProductFilter());
> }
>
> Finally, I got an new error message.
>
> Error Message:
> Exception in thread "main" org.apache.ibatis.exceptions.IbatisException:
> ### Error querying database.
> Cause: org.apache.ibatis.reflection.ReflectionException:
>
> Could not set property 'rs' of 'com.domain.filter.productfil...@13f210f'
> with value '[productCode:1, productName:1, publisherCode:1, swGroupCode:1
> , swType:1, version:1]'
>
> Cause: java.lang.IllegalArgumentException: argument type mismatch
>
>
>
>
> I would appreciate if anyone can let me know the corrections as this.
>
> Thanks,
> Alex
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
> For additional commands, e-mail: user-java-h...@ibatis.apache.org
>
>

Reply via email to