2017-02-19 1 views
3

Описание: Попытка создать вызов службы шлюза, который возвращает тип массива oracle. Специально получаем sys.dbmsoutput_linesarray. Ошибка, которую я получаю ниже, кажется, что у меня что-то не так в моей конфигурации, когда я регистрирую параметр OUT или, возможно, в службе. Интересно, может ли кто-нибудь сказать мне, что я делаю неправильно?Весенняя интеграция - невозможность получить Oracle Array OUT PARAM

Сообщение об ошибке: CallableStatementCallback; не классифицированный SQLException для SQL [{вызов GET_DBMS_OUTPUT (?)}]; Состояние SQL [99999]; код ошибки [17004]; Недопустимый тип столбца: 1111; вложенное исключение java.sql.SQLException: Неверный тип столбца: 1111

Реферировано пример кода я пытаюсь сделать весной интеграции: JAVA DBMS ORACLE ARRAY CALLABLE STATEMENT EXAMPLE

Oracle 12c - PL SQL Функция:

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; 

Весенний контекстный файл - Взято из весенней интеграции git hub example хранимая процедура-оракул. Примерный код был дополнен следующим исходящим шлюзом.

<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 - Обновлены служба преобразования строк

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 - ГЛАВНОЕ

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

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

Обновлено: Spring Config: - Добавлен боб для SqlReturnArray. - Добавлен возвращаемый тип ссылки на SqlReturnArray bean - Измените StringConversionService на использование String [], а не на тип возвращаемого массива oracle. - Обновлен главный класс, чтобы получить String []

ответ

1

Вы должны добавить return-type и реализовать его как-то вроде SqlReturnArray:

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

Где sqlReturnArray является боб этого SqlReturnArray.

И, конечно, обрабатывайте результат как String[], а не там ARRAY.

+0

Вам всегда нужно использовать возвращаемый тип для параметров OUT? Кажется, в примерах он не всегда использует его. Это потому, что Spring использует метаданные JDBC под обложками, чтобы определить, что возвращается? Как варчар или номер. – haju

+0

Нет, вы должны использовать его для нестандартных сложных типов. –

+0

Добавлен источник данных spring-data-jdbc-core 1.2. Теперь получаем ошибку весеннего контекста, добавляя это выше. Невозможно разрешить ссылку на bean '# {new org.springframework.data.jdbc.support.oracle.SqlReturnArray()}' ... при настройке аргумента; org.springframework.expression.spel.SpelEvaluationException: EL1003E: (pos 0): Возникла проблема при попытке создать объект типа 'org.springframework.data.jdbc.support.oracle.SqlReturnArray' с использованием аргументов '()' – haju

Смежные вопросы