首页 文章

Spring-> Oracle存储过程调用模式问题

提问于
浏览
1

作为重构的一部分,我试图更改数据库调用以使用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中运行它们开发人员 .

在此先感谢您的帮助 .

1 回答

  • 1

    事实证明我犯了一个愚蠢的错误(拼写错误)并且仍在使用旧的数据源,因此使用的用户与INV不同 . 感谢德米特里让我意识到这一点 . 当我能够使用基本的JDBC CallableStatement时,仍然不确定为什么我无法使用Spring框架从不同的用户执行该过程 . 它适用于INV数据源,这对我来说是一个令人满意的解决方案

相关问题