MyBatis: хранимая процедура Sybase возвращает ноль строк - PullRequest
1 голос
/ 05 ноября 2010

Я скопировал текст отсюда: http://code.google.com/p/mybatis/issues/detail?id=164,, но мы столкнулись с той же проблемой.

MyBatis версия 3.0.1

Я использую MyBatis 3 в качестве отображения OR междуJava-приложение и база данных Sybase.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', result2=@in
    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());

  }

}

обычно результат долженбыть:

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

но на самом деле, нет результата get, также нет исключений:

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

после контр-теста, если я удалю внутреннюю переменную @var из sp, то онавсе будет в порядке.

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

    as
     select result1= '1', result2=@in
    go
    grant exec on testSP  to public
    go
</code>

Не могли бы вы проверить, в чем проблема и что мне делать, чтобы убедиться, что я могу вызвать этот вид хранимой процедуры?

1 Ответ

1 голос
/ 05 ноября 2010

Я хотел бы пересмотреть одну опечатку для вышеприведенного поста.

обычно результат должен быть: DEBUG PreparedStatement - ==> Executing: {call tempdb..testSP ?} <br/> DEBUG PreparedStatement - ==> Parameters: mydata(String)<br/> DEBUG ResultSet - <== Columns: result1, result2<br/> DEBUG ResultSet - <== Row: 1, mydata<br/>

...