2010-11-05 63 views
1

我已将这里的文本复制到: http://code.google.com/p/mybatis/issues/detail?id=164,但我们遇到了同样的问题。MyBatis:Sybase存储过程返回零行

MyBatis的版本3.0.1

我使用的MyBatis 3作为Java应用程序和Sybase数据库之间的OR映射。 用于从数据库查询数据的sql是一个存储过程,对于简单的过程可以,但是如果在存储过程中声明并使用了内部变量,它似乎无法正常工作,查询结果为空,而没有异常投掷。

下面是示例代码,我也附上作为附件。 的JavaBean:


    public class Test { 

    private String input1; 
    private String input2; 

    public String getInput1() { 
     return input1; 
    } 

    public void setInput1(String input1) { 
     this.input1 = input1; 
    } 

    public String getInput2() { 
     return input2; 
    } 

    public void setInput2(String input2) { 
     this.input2 = input2; 
    } 
    } 

SQLMAP:


    <mapper namespace="cargoStatus_shipment"> 
    <resultMap id="testMap"  type="com.icil.esolution.cargoStatus.AS.model.Test"> 
    <result column="result1" jdbcType="VARCHAR" property="input1" /> 
    <result column="result2" jdbcType="VARCHAR" property="input2" /> 
    </resultMap> 

    <select id="getValidData" statementType="CALLABLE"  resultMap="testMap"  parameterType="String"> 
    {call tempdb..testSP #{in}} 
    </select> 

    </mapper> 

存储过程:


    use tempdb 
    go 
    drop proc testSP 
    go 
    create proc testSP 
     @in varchar(10) 

    as 
    declare @var char(3) 
    select @var="XXX" 
    select result1= '1', [email protected] 
    go 
    grant exec on testSP to public 
    go 

Java代码:


public class TestSP { 


    private static SqlSessionFactory createSqlMapper() throws IOException { 
     String resource = "resources/sqlMapConfig.xml"; 
     Reader reader = Resources.getResourceAsReader(resource); 
     return new SqlSessionFactoryBuilder().build(reader,"development"); 
    } 


    public static void main(String[] args) { 

    SqlSession session=null; 
    try { 
      session = createSqlMapper().openSession(ExecutorType.SIMPLE, true); //autocommit = true 

    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Error in open Session. Cause: " + e); 
     System.exit(1); 
    } 


    List result = (List) session.selectList("getValidData", "mydata"); 

    System.out.println("Result = "+result); 
    System.out.println(result.get(2).getInput2()); 

    } 

} 

正常的结果应该是:

DEBUG PreparedStatement - ==> Executing: {call tempdb..testSP ?} 
DEBUG PreparedStatement - ==> Parameters: mydata(String) 
DEBUG ResultSet -

但实际上,没有结果得到的,也不例外:

DEBUG PreparedStatement - ==> Executing: {call tempdb..testSP ?} 
DEBUG PreparedStatement - ==> Parameters: mydata(String)

计数器试验之后,如果我从SP取下内部变量@var,那么这将是确定。

 
    use tempdb 
    go 
    drop proc testSP 
    go 
    create proc testSP 
     @in varchar(10) 

    as 
    select result1= '1', [email protected] 
    go 
    grant exec on testSP to public 
    go 

你能否检查一下是什么问题,我该怎么做才能确保我可以调用这种存储过程?

回答

1

我希望修改上面的帖子中的一个错字。

正常的结果应该是:
DEBUG PreparedStatement - ==> Executing: {call tempdb..testSP ?}
DEBUG PreparedStatement - ==> Parameters: mydata(String)
DEBUG ResultSet - <== Columns: result1, result2
DEBUG ResultSet - <== Row: 1, mydata