【问题标题】:Spring->Oracle stored procedure call schema issuesSpring->Oracle 存储过程调用架构问题
【发布时间】: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_TEST 2. 尝试执行 select count(*) from all_procedures where owner = 'INV' and object_name = 'SPRING_JDBC_TEMPLATE_TEST'; - 结果必须 >= 1 3. 它可能是您框架的“功能” - 在这种情况下,我无能为力
  • 已经用几种不同的方式尝试了全名:通过将 .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


【解决方案1】:

原来我犯了一个愚蠢的错误(错字)并且仍在使用旧数据源,因此用户与 INV 不同。感谢 Dmitry 让我意识到这一点。当我能够使用基本的 JDBC CallableStatement 执行此操作时,仍然不确定为什么我无法使用 Spring 框架从其他用户执行该过程。但它适用于 INV 数据源,这对我来说是一个令人满意的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2017-02-09
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多