Spring-›Проблемы со схемой вызовов хранимых процедур Oracle

В рамках рефакторинга я пытаюсь изменить вызовы базы данных, чтобы использовать Spring 4.1.0.RELEASE, чтобы обрабатывать соединения и исключения и разрешать передачу наборов результатов между функциями и классами.

У меня нормально работают вызовы хранимых процедур MS SQL Server, но когда я попытался выполнить хранимую процедуру Oracle, я получил следующее сообщение об ошибке:

2014-11-13 15:39:35,836 ERROR [io.undertow.request] (default task-1) UT005023: Exception handling request to /EmailServiceLayer/EmailServletClient/springtest/123: 
org.jboss.resteasy.spi.UnhandledException: org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; 
bad SQL grammar [{call SPRING_JDBC_TEMPLATE_TEST()}]; nested exception is java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00201: identifier 'SPRING_JDBC_TEMPLATE_TEST' must be declared

Я упростил проблему, написав пару очень простых хранимых процедур, которые пишут в тестовую таблицу: одна принимает параметр и записывает, а другая не принимает параметров и просто записывает жестко заданное значение. Эти процедуры находятся в схеме INV, которая является тем же пользователем, на использование которого настроен мой источник данных.

В конце концов я попытался запустить его в своей личной схеме, используя источник данных, настроенный на использование моих личных учетных данных, и это удалось. У меня был грант администратора, чтобы выполнить все процедуры в INV, но все равно не повезло. Я подтвердил, что могу успешно выполнять простые встроенные вставки в схему INV, используя Spring JdbcTemplate.execute().

Мои первые попытки заключались в использовании JdbcTemplate с CallableStatementCreator моего собственного определения. Затем я попытался использовать SimpleJdbcCall, и я обнаружил, что это работает на моей личной схеме. Оба способа дают одно и то же сообщение об ошибке в схеме INV. Вот код моей последней попытки:

SimpleJdbcCall caller = new SimpleJdbcCall(alex3InvTemplate).withProcedureName("spring_jdbc_template_test");
MapSqlParameterSource paramMap = new MapSqlParameterSource();
paramMap.addValue("p_testval", testval);
Map<String, Object> result = caller.execute(paramMap);

и мой тестовый процесс:

create or replace
procedure                 spring_jdbc_template_test 
(
  p_testval IN number
)
as
begin

    insert into jdbc_template_test_table values(p_testval);
    commit;

end;

Мое приложение работает на сервере Wildfly 8.0.0.Final. Конфигурации источника данных для двух схем абсолютно одинаковы, за исключением учетных данных, используемых для входа в систему. Я могу выполнять процедуры в INV, используя один и тот же источник данных с базовым JDBC CallableStatement, и я подтвердил, что могу запускать их в SQL. Разработчик.

Заранее благодарю за любую помощь.


person Pete    schedule 14.11.2014    source источник
comment
Извините, я не знаю java, просто для уточнения: 1. вы подключаетесь к серверу как пользователь INV, вызываете процедуру в схеме INV и после этого получаете ошибку; 2. подключаешься к своей схеме, вызываешь процедуру в своей схеме и все нормально работает. Да?   -  person Dmitriy    schedule 14.11.2014
comment
Правильный. Исходя из этого, похоже, проблема с конфигурацией БД со схемой INV, но вызов работал, когда я не использовал Spring, а только CallableStatement. Фактически, это работало с CallableStatement, когда я подключался как другой пользователь, чем INV.   -  person Pete    schedule 14.11.2014
comment
1. Попробуйте назвать его полным именем - INV.SPRING_JDBC_TEMPLATE_TEST 2. Попробуйте выполнить select count(*) from all_procedures where owner = 'INV' and object_name = 'SPRING_JDBC_TEMPLATE_TEST'; - результат должен быть ›= 1 3. Это может быть особенность вашего фреймворка - в данном случае я не смог помочь   -  person Dmitriy    schedule 14.11.2014
comment
Уже попробовал полное имя несколькими способами: добавив .withSchemaName(INV) и .withCatalogName(INV) в SimpleJdbcCall и добавив INV. перед именем процедуры. Для запроса подсчета я получаю 0 (но без исключений), когда запускаю его с помощью метода Spring JdbcTemplate.queryForList. Когда я запускаю его через SQL Developer, я получаю 1   -  person Pete    schedule 15.11.2014
comment
Результаты select очень странные. Сначала я хотел бы сделать после получения 0 через spring и 1 через SQL Developer здесь - выполнить select user from dual. Потому что я не верю в чудеса ;)   -  person Dmitriy    schedule 15.11.2014
comment
Большое спасибо @Dmitry! Оказывается, я ошибся при подключении источника данных INV, и он все еще использовал пользователя SEARCH. Я нашел недостающую ссылку и подключил ее, и это сработало. Я очень рад, что прошел мимо этого, но мне также очень неловко, что я потратил столько времени на работу над этой ошибкой и не поймал что-то настолько простое. Я все еще не понимаю, как я не мог выполнить процедуру от пользователя SEARCH с помощью Spring, когда она работала, используя только CallableStatement. Но это вряд ли имеет значение, так как я могу использовать источник данных INV.   -  person Pete    schedule 15.11.2014


Ответы (1)


Оказывается, я сделал глупую ошибку (опечатку) и все еще использовал старый источник данных и, следовательно, другого пользователя, чем INV. Спасибо Дмитрию за то, что заставил меня это осознать. Все еще не уверен, почему я не могу выполнить процедуру от другого пользователя с помощью среды Spring, когда я смог сделать это с помощью базового JDBC CallableStatement. Однако он работает с источником данных INV, и это удовлетворительное решение для меня.

person Pete    schedule 14.11.2014