PLS-00306 с функцией вызова SimpleJdbcCall

#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 на 1 Integer ? Попробуйте включить ведение журнала отладки org.springframework.jdbc и проверить, что выводится при подготовке и выполнении функции.

4. Я заметил, что параметры должны соответствовать имени, иначе он на самом деле жалуется на это и не выполняется. Функция AddValue позволяет определить тип sql, и я попробовал использовать OracleType. ЧИСЛО или общие типы. числовой. Я также пробовал с длинным, большим регистром, большим десятичным… похоже, это вообще не влияет. Я проверю режим отладки, чтобы посмотреть, что происходит.