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 []
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
Nein, Sie müssen es für nicht-standardmäßige, komplexe Typen verwenden –
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