作为重构的一部分,我试图更改数据库调用以使用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的程序,但仍然没有运气。我已经确认我可以使用Spring JdbcTemplate.execute()在INV模式上成功执行简单的内联插入。
我的第一次尝试是将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服务器上运行。除了用于登录的凭据之外,2个模式的数据源配置完全相同。我能够使用与基本JDBC CallableStatement相同的数据源执行INV中的过程,并且我已经确认我可以运行它们在SQL Developer中。
提前感谢您的帮助。
答案 0 :(得分:1)
原来我犯了一个愚蠢的错误(拼写错误)并且仍在使用旧数据源,因此使用的用户与INV不同。感谢德米特里让我意识到这一点。仍然不确定为什么当我能够使用基本的JDBC CallableStatement时,我无法使用Spring框架从不同的用户执行该过程。它适用于INV数据源,这对我来说是一个令人满意的解决方案