2014-11-14 1 views
1

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

Я получил мой 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 Разработчик.

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

+0

Извините, я не знаю java, просто чтобы уточнить: 1. вы подключаетесь к серверу как пользователь INV, вызывают процедуру в схеме INV и после этого получают ошибку ; 2. Вы подключаетесь к своей собственной схеме, процедуре вызова в своей собственной схеме, и все работает нормально. Да? – Dmitry

+0

Правильно. Исходя из этого, это похоже на проблему с конфигурацией db с помощью схемы INV, но вызов работал, когда я не использовал Spring, просто CallableStatement. Фактически, он работал с CallableStatement, когда я подключался как другой пользователь, чем INV – Pete

+0

1. Попробуйте вызвать его по имени - 'INV.SPRING_JDBC_TEMPLATE_TEST' 2. Попробуйте выполнить' select count (*) из all_procedures , где владелец = 'INV' и object_name = 'SPRING_JDBC_TEMPLATE_TEST'; '- результат должен быть> =' 1' 3. Это может быть «особенность» вашей структуры - в этом случае я не мог помочь – Dmitry

ответ

1

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