2016-06-02 6 views
0

Ich versuche, eine gespeicherte Oracle-Prozedur auszuführen, und die Ergebnisse zu einem POJO, mit mybatis/spring mit Anmerkungen (d. H. Nicht XML). Die Ein-/Ausgänge für die gespeicherte Prozedur sind:führen Sie Oracle gespeicherte Prozedur mit MyBatis/Spring und Parse-Ergebnisse zu einem POJO

P_INPUT  VARCHAR2   IN       
P_OUTPUT VARCHAR2   OUT    
P_COUNT  BINARY_INTEGER OUT    

Und die POJO sieht wie folgt aus:

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

Das Snippet in this example, die sagt, es ist für Oracle, funktionierte perfekt für mich gegen eine MySQL gespeichert Verfahren. Allerdings, wenn ich versuchte, die folgende für eine Oracle gespeicherte Prozedur auszuführen:

@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); 

... es die folgenden Fehler warf:

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 

Von der Fehlermeldung, es klingt wie die Zeichenfolge übergeben werden zu der Funktion möglicherweise inkompatibel mit Oracle VARCHAR2, oder ich sende irgendwie mehr als ein Argument. Die Zeichenfolge, die ich an die Funktion übergebe, ist übrigens (12345).

Können Sie sehen, was ich falsch mache?

+0

Es ist eine Oracle-Prozedur, also müssen Sie auch diese Parameter übergeben. Es funktioniert als Referenz. Es wäre etwa so: '{CALL my_user.some_package.my_proc ('$ {input}', '$ {out1}', '$ {out2}'}} Aber ich habe keine Idee, wie ich es auf MyBatis machen soll Anmerkungen. –

+0

Vielleicht würde Ihnen das helfen: http://stackoverflow.com/questions/9215784/java-mybatis-stored-procedure-call-with-out-parameters –

+0

Eine andere, die sogar Ihre Frage dupliziert: http: // stackoverflow. com/questions/24910795/mybatis-annotations-zu-call-stored-procedure-and-get-out-params –

Antwort

1

@Jorge hatte Recht. Es war notwendig, die POJO mit dem Eingangsparameter zu instanziiert:

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

Dann den Eingangsparameter des POJO setzen und den Dienst rufen:

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

    dbMapperOracle.parseMyInput(myRecord); 

Der Dienst ruft den Mapper, die POJO vorbei, die enthalten Variablen sowohl für den Eingang (zu diesem Zeitpunkt null sind, die) (das eingestellt wurde) und Ausgabeparameter:

public class DbServiceOracle { 

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

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

und der Mapper bildet die aus t zurückgegebenen Ergebnisse er Verfahren zum POJO gespeichert:

@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); 

Credit Sanjay Kumar, der a more complete example in seinem GitHub Konto setzen.

Verwandte Themen