#java #spring #spring-jdbc
Вопрос:
У меня есть следующая функция:
create or replace PACKAGE BODY "CATALOG_NAME" IS
FUNCTION FUNCTION_NAME (Param1 Varchar2, Param2 Varchar2, Param3 Number) Return Number;
END;
И я пытаюсь вызвать его с Java:
JdbcTemplate template = new JdbcTemplate(this.datasource);
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(template)
.withSchemaName("SCHEMA_NAME")
.withCatalogName("CATALOG_NAME")
.withFunctionName("FUNCTION_NAME");
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("Param1", "value1");
params.addValue("Param2", "value2");
params.addValue("Param3", Integer.valueOf(0));
return simpleJdbcCall.executeFunction(Integer.class, params);
Это запуск исключения:
org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{? = call SCHEMA_NAME.CATALOG_NAME.FUNCTION_NAME(?, ?)}]; nested exception is java.sql.SQLException: PLS-
00306: wrong number or types of arguments in call to 'FUNCTION_NAME'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Первое, что я заметил, это то, что запускаемый запрос имеет 2 входных параметра вместо 3.
Что я делаю не так?
Комментарии:
1. Вы не зарегистрировали параметры входа и выхода в
SimpleJdbcCall
.2. Я попытался объявить параметры, но я думаю, что объявление параметров требуется с помощью процедуры, а не с помощью функции (это ничего не изменило). Наконец, я создал процедуру, которая вызывает функцию внутренне, и это, кажется, работает. Однако будет интересно узнать, что не так в этом коде.
3. Когда функция вызывается, она пытается соответствовать имени и/или типу. Может быть, это
Number
не соответствует 1 на 1Integer
? Попробуйте включить ведение журнала отладкиorg.springframework.jdbc
и проверить, что выводится при подготовке и выполнении функции.4. Я заметил, что параметры должны соответствовать имени, иначе он на самом деле жалуется на это и не выполняется. Функция AddValue позволяет определить тип sql, и я попробовал использовать OracleType. ЧИСЛО или общие типы. числовой. Я также пробовал с длинным, большим регистром, большим десятичным… похоже, это вообще не влияет. Я проверю режим отладки, чтобы посмотреть, что происходит.