2017-02-19 8 views
3

Beschreibung: Es wurde versucht, einen Gateway-Serviceaufruf zu erstellen, der einen Oracle-Array-Typ zurückgibt. Speziell das sys.dbmsoutput_linesarray holen. Der Fehler, den ich unten bekomme, scheint, dass ich etwas falsch an meiner Konfiguration habe, wenn ich den OUT-Parameter oder möglicherweise im Service registriere. Fragen Sie sich, ob mir jemand sagen kann, was ich falsch mache?Spring-Integration - Oracle-Array konnte nicht abgerufen werden OUT PARAM

Fehlermeldung: CallableStatementCallback; nicht kategorisierte SQLException for SQL [{Aufruf GET_DBMS_OUTPUT (?)}]; SQL-Status [99999]; Fehlercode [17004]; Ungültiger Spaltentyp: 1111; verschachtelte Ausnahme ist java.sql.SQLException: Ungültige Spaltentyp: 1111

referenzierte Codebeispiel Ich versuche, im Frühjahr Integration zu tun: JAVA DBMS ORACLE ARRAY CALLABLE STATEMENT EXAMPLE

Oracle 12c - PL SQL Funktion:

create or replace function get_dbms_output 
    return dbmsoutput_linesarray 
as 
    l_output dbmsoutput_linesarray; 
    l_linecount number; 
begin 
    dbms_output.enable; 
     dbms_output.put_line('This is a line'); 
     dbms_output.put_line('This is another line'); 
     dbms_output.put_line('This is the last line.'); 


    dbms_output.get_lines(l_output, l_linecount); 

    if l_output.count > l_linecount then 
     -- Remove the final empty line above l_linecount 
     l_output.trim; 
    end if; 

    return l_output; 
end get_dbms_output; 

Spring Context File - aus dem Frühlingsintegrations-Git-Hub entnommen Beispiel Stored-Procedure-Orakel. Beispielcode wurde mit dem folgenden Outbound-Gateway erweitert.

<bean id="sqlReturnArray" class="org.springframework.data.jdbc.support.oracle.SqlReturnArray"></bean> 

<int-jdbc:stored-proc-outbound-gateway 
    id="outbound-gateway-function-dbms" request-channel="procedureDBMSRequestChannel" 
    data-source="dataSource" 
    stored-procedure-name="get_dbms_output" 
    expect-single-result="true"> 

    <int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}" type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" /> 

</int-jdbc:stored-proc-outbound-gateway> 

JAVA - Aktualisiert String Conversion Service

public interface StringConversionService { 

    /** 
    * Converts a String to Upper Case. 
    * 
    * @param stringToConvert The string to convert to upper case 
    * @return The converted upper case string. 
    */ 
    String convertToUpperCase(String stringToConvert); 

    Integer getNumber(); 

    @Payload("new java.util.Date()") 
    String[] getLines(); 
} 

JAVA - HAUPT

final StringConversionService service = context.getBean(StringConversionService.class); 

     System.out.println("Calling Stored Proc"); 
     String[] dbmsLines = service.getLines(); 

Aktualisiert: Frühling Config: - Added eine Bohne für SqlReturnArray. - Rückgabetyp für einen Verweis auf SqlReturnArray-Bean hinzugefügt - Ändern Sie den StringConversionService so, dass er einen String [] anstelle des Rückgabetyps Oracle Array verwendet. - Hauptklasse Aktualisiert erhalten String []

Antwort

1

Sie haben return-type hinzuzufügen und es irgendwie umsetzen wie SqlReturnArray:

<int-jdbc:sql-parameter-definition name="l_output" type="#{T(oracle.jdbc.OracleTypes).ARRAY}" type-name="DBMSOUTPUT_LINESARRAY" direction="OUT" return-type="sqlReturnArray" /> 

Wo sqlReturnArray eine Bohne dieser SqlReturnArray ist.

Und natürlich, behandeln Sie das Ergebnis als String[] bereits, nicht eine nicht verfügbare ARRAY.

+0

Müssen Sie immer den Rückgabetyp für OUT-Parameter verwenden? Es scheint in den Beispielen es nicht immer zu benutzen. Ist das so, weil Spring die JDBC-Metadaten unter den Deckblättern verwendet, um festzustellen, was zurückgegeben wird? Wie Varchar oder Nummer. – haju

+0

Nein, Sie müssen es für nicht-standardmäßige, komplexe Typen verwenden –

+0

Hinzugefügt spring-data-jdbc-core 1.2. Nun bekomme ich einen Spring-Context-Fehler, der das oben hinzufügt. Der Verweis auf Bean '# {new org.springframework.data.jdbc.support.oracle.SqlReturnArray()}' kann nicht aufgelöst werden, während das Argument argument; org.springframework.expression.spsel.SpelEvaluationException: EL1003E: (pos 0): Beim Versuch, ein Objekt vom Typ 'org.springframework.data.jdbc.support.oracle.SqlReturnArray' mit Argumenten '()' zu erstellen, ist ein Problem aufgetreten. – haju

Verwandte Themen