【发布时间】:2015-01-11 07:37:14
【问题描述】:
作为重构的一部分,我正在尝试将数据库调用更改为使用 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 中运行它们开发者。
提前感谢您的帮助。
【问题讨论】:
-
对不起,我不懂java,只是为了澄清一下:1.您以用户INV连接到服务器,在模式INV中调用过程,然后收到错误; 2.你连接到你自己的模式,在你自己的模式中调用过程,一切正常。是吗?
-
正确。基于此,这似乎是 INV 模式的数据库配置问题,但是当我不使用 Spring 时调用有效,只是一个 CallableStatement。事实上,当我以不同于 INV 的用户身份连接时,它与 CallableStatement 一起工作
-
1.尝试用全名调用它 -
INV.SPRING_JDBC_TEMPLATE_TEST2. 尝试执行select count(*) from all_procedures where owner = 'INV' and object_name = 'SPRING_JDBC_TEMPLATE_TEST';- 结果必须 >=13. 它可能是您框架的“功能” - 在这种情况下,我无能为力 -
已经用几种不同的方式尝试了全名:通过将 .withSchemaName("INV") 和 .withCatalogName("INV") 添加到 SimpleJdbcCall 并添加“INV”。在过程名称前面。对于计数查询,当我通过 Spring JdbcTemplate.queryForList 方法运行它时,我得到 0(但没有例外)。当我通过 SQL Developer 运行它时,我得到 1
-
select 的结果很奇怪。首先,我想在通过 spring 接收 0 和通过 SQL Developer 接收 1 之后执行 - 执行
select user from dual。因为我不相信奇迹;)
标签: spring oracle stored-procedures jdbc wildfly-8