Описание: Попытка создать вызов службы шлюза, который возвращает тип массива 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 []
Вам всегда нужно использовать возвращаемый тип для параметров OUT? Кажется, в примерах он не всегда использует его. Это потому, что Spring использует метаданные JDBC под обложками, чтобы определить, что возвращается? Как варчар или номер. – haju
Нет, вы должны использовать его для нестандартных сложных типов. –
Добавлен источник данных 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