【问题标题】:execute Oracle stored procedure using MyBatis/Spring and parse results to a POJO使用 MyBatis/Spring 执行 Oracle 存储过程并将结果解析为 POJO
【发布时间】:2016-06-08 05:35:40
【问题描述】:

我正在尝试执行 Oracle 存储过程,并将结果映射到 POJO,mybatis/spring 使用注释(即不是 XML)。存储过程的输入/输出是:

P_INPUT     VARCHAR2         IN                         
P_OUTPUT    VARCHAR2         OUT            
P_COUNT     BINARY_INTEGER   OUT            

POJO 看起来像这样:

public class MyRecord {
    private String output;
    private Integer count;
    // getters and setters...
}

this example 中的 sn-p 表示它适用于 Oracle,它对我来说非常适合 MySQL 存储过程。但是,当我尝试对 Oracle 存储过程执行以下操作时:

@Select(value= "{ CALL my_user.some_package.my_proc('${input}') }")
@Options(statementType = StatementType.CALLABLE)
@ResultType(MyRecord.class)
@Results({
                @Result(property="output", column="P_OUTPUT"),
                @Result(property="count", column="P_COUNT"),
         })
MyRecord parseMyInput(@Param("input") String input);

...它抛出了以下错误:

bad SQL grammar []; nested exception is java.sql.SQLException: ORA-06550
PLS-00306: wrong number or types of arguments in call to 'my_proc'
PL/SQL: Statement ignored

从错误消息中,听起来传递给函数的字符串可能与 Oracle 的 VARCHAR2 不兼容,或者我以某种方式发送了多个参数。我传递给函数的字符串是(12345)。

你能看出我做错了什么吗?

【问题讨论】:

  • 这是一个 Oracle 程序,所以您也必须传递这些参数。它可以作为参考。它会是这样的:{ CALL my_user.some_package.my_proc('${input}', '${out1}', '${out2}') } 但我不知道如何在 MyBatis 注释上做到这一点。
  • 也许这会对你有所帮助:stackoverflow.com/questions/9215784/…
  • 另一个甚至使您的问题重复的问题:stackoverflow.com/questions/24910795/…
  • 非常感谢,@JorgeCampos。重复问题中的答案对我不起作用,但我现在正在尝试您的其他建议。
  • 您是否像在重复问题中一样测试了传递参数?类似于:{ CALL my_user.some_package.my_proc('${input, mode=IN, jdbcType=VARCHAR}', '${out1, mode=OUT, jdbcType=VARCHAR}', '${out2, mode=OUT, jdbcType=INTEGER }')

标签: oracle stored-procedures mybatis spring-mybatis


【解决方案1】:

@Jorge 是对的。有必要使用输入参数来实例化 POJO:

public class MyRecord {
    private String input;
    private String output;
    private Integer count;
    // getters and setters...
}

然后设置POJO的入参,调用服务:

    MyRecord myRecord = new myRecord();
    myRecord.setInput("myInput");

    dbMapperOracle.parseMyInput(myRecord);

服务调用映射器,传递包含输入(已设置)和输出参数(此时为空)的变量的 POJO:

public class DbServiceOracle {

    @Autowired
    @Qualifier("dataSourceOracle")
    private DbMapperOracle dbMapperOracle;

    public MyRecord parseMyInput(MyRecord params){
        dbMapperOracle.parseMyInput(params);
        return params;
    }
}

并且mapper将存储过程返回的结果映射到POJO:

@Select(value= "{ CALL my_user.some_package.my_proc(" +
        "#{input,   mode=IN,  javaType = java.lang.String,  jdbcType=VARCHAR}, " +
        "#{output,  mode=OUT, javaType = java.lang.String,  jdbcType=VARCHAR}, " +
        "#{count,   mode=OUT, javaType = java.lang.Integer, jdbcType=NUMERIC}, "
        ") }")
@Options(statementType = StatementType.CALLABLE)
@ResultType(MyRecord.class)
@Results({
                @Result(property="input", column="P_INPUT"),
                @Result(property="output", column="P_OUTPUT"),
                @Result(property="count", column="P_COUNT"),
        })
MyRecord parseMyInput(MyRecord params);

感谢 Sanjay Kumar,他将 a more complete example 放入了他的 GitHub 帐户。

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2013-03-18
    • 2017-10-07
    • 2018-11-07
    相关资源
    最近更新 更多