Spring 春季->;Oracle存储过程调用架构问题

Spring 春季->;Oracle存储过程调用架构问题,spring,oracle,stored-procedures,jdbc,wildfly-8,Spring,Oracle,Stored Procedures,Jdbc,Wildfly 8,作为重构的一部分,我尝试将数据库调用更改为使用Spring4.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 /EmailServiceLaye

作为重构的一部分,我尝试将数据库调用更改为使用Spring4.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中的所有程序,但仍然没有运气。我已经确认,我可以使用SpringJDBCTemplate.execute()在INV模式上成功执行简单的内联插入

我的第一次尝试是将JdbcTemplate与我自己定义的CallableStatementCreator一起使用。然后我尝试使用SimpleJDBCall,我发现它在我的个人模式中起作用。这两种方法在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);
我的应用程序正在Wildfly 8.0.0.Final服务器上运行。除用于登录的凭据外,这两个架构的数据源配置完全相同。我能够使用基本JDBC CallableStatement使用相同的数据源在INV中执行这些过程,并且我已经确认可以在SQL Developer中运行它们


提前感谢您的帮助。

事实证明我犯了一个愚蠢的错误(打字错误),仍然在使用一个旧的数据源,因此是一个不同于INV的用户。感谢Dmitry让我意识到这一点。我仍然不知道为什么我不能使用基本的JDBC CallableStatement从使用Spring框架的不同用户执行该过程。不过,它可以与INV数据源一起工作,这对我来说是一个令人满意的解决方案

对不起,我不懂java,只是想澄清一下:1。您以用户INV的身份连接到服务器,调用schema INV中的过程,然后接收错误;2.您可以连接到自己的模式,在自己的模式中调用过程,所有这些都可以正常工作。是吗?没错。基于这一点,INV模式似乎存在db配置问题,但在我不使用Spring时,调用就起作用了,只是一个CallableStatement。事实上,当我以不同于INV1的用户身份连接时,它与CallableStatement一起工作。试着用全名来称呼它-
INV.SPRING\u JDBC\u TEMPLATE\u TEST
2。尝试从所有_过程中执行
select count(*),其中owner='INV'和object_name='SPRING\u JDBC\u TEMPLATE\u TEST'-结果必须是>=
1
3。它可能是您的框架的一个“功能”-在本例中,我已经尝试了几种不同的方法:将.WithChemaname(“INV”)和.withCatalogName(“INV”)添加到SimpleJDBCall中,并在过程名称前面添加“INV.”。对于计数查询,当我通过Spring JdbcTemplate.queryForList方法运行它时,得到0(但没有异常)。当我通过SQL Developer运行它时,我得到1个select的结果非常奇怪。首先,我想通过spring接收0,通过SQL Developer接收1,然后在这里执行-execute
select user from dual
。因为我不相信奇迹;)
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;