2010-11-05 9 views
1

J'ai copié le texte à partir d'ici: http://code.google.com/p/mybatis/issues/detail?id=164, mais nous avons rencontré le même problème.MyBatis: procédure stockée Sybase renvoie zéro lignes

mybatis Version 3.0.1

J'utilise mybatis 3 en tant que OU mappage entre l'application Java et la base de données Sybase. Le sql utilisé pour interroger les données de la base de données est une procédure stockée, il est correct pour une procédure simple, mais si une variable interne est déclarée et utilisée dans la procédure stockée, elle semble ne pas fonctionner correctement, le résultat de la requête est nul. il n'y a aucune exception jetant. Ci-dessous est le code d'exemple, et je joins également en pièce jointe. 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> 

procédure stockée:


    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 

code 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()); 

    } 

} 

normalement le résultat devrait être:

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

mais en réalité, il n'y a aucun résultat, ni obtenir des exceptions:

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

après compteur test, si je retire la @var la variable interne de la SP, ce sera ok.

 
    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 

Pourriez-vous Pls vérifier quel est le problème et que dois-je faire pour que je puisse appeler ce genre de procédure stockée?

Répondre

1

Je voudrais réviser une faute de frappe pour le poste ci-dessus.

normalement le résultat devrait être:
DEBUG PreparedStatement - ==> Executing: {call tempdb..testSP ?}
DEBUG PreparedStatement - ==> Parameters: mydata(String)
DEBUG ResultSet - <== Columns: result1, result2
DEBUG ResultSet - <== Row: 1, mydata

Questions connexes