首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-14552:无法在查询或DML中执行DDL、提交或回滚。

ORA-14552:无法在查询或DML中执行DDL、提交或回滚。
EN

Stack Overflow用户
提问于 2013-05-15 23:30:25
回答 1查看 4.8K关注 0票数 3

我们在Oracle中部署了一些WebLogic,该服务的主要响应性是调用存储过程并将数据发送给客户端。服务的技术堆栈是:

  • 贾克斯-WS
  • 弹簧框架
  • MyBatis

服务从WebLogic提供的连接池中获取到数据库的连接。几个月以来,服务运行良好,但这几天我们遇到了以下问题:

代码语言:javascript
复制
SERVER: WLSDesa_ManagedServer1 [DEBUG] [15-05-2013 12:23:03.897] (JakartaCommonsLoggingImpl.java:46) - ooo Using Connection [weblogic.jdbc.wrapper.PoolConnection_oracle_jdbc_driver_T4CConnection@59bd]
SERVER: WLSDesa_ManagedServer1 [DEBUG] [15-05-2013 12:23:03.898] (JakartaCommonsLoggingImpl.java:46) - ==>  Preparing: { call package.iOnlyDoASelect( ?, ?) } 
a.package.from.project.CommonException: org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: java.sql.SQLException: ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 

### The error may exist in a/package/from/the/project/ImAMyBatisMap.xml
### The error may involve a.package.from.the.project.ImADaoClass.invokeProcedure-Inline
### The error occurred while setting parameters
### SQL: { call package.iOnlyDoASelect(   ?,   ?)   }
### Cause: java.sql.SQLException: ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 

; uncategorized SQLException for SQL []; SQL state [72000]; error code [14552]; ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 
; nested exception is java.sql.SQLException: ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 

这个过程只是几个表的Select,我们可以正常地从另一个Java应用程序和数据库客户端调用它;在服务中,我们没有使用任何显式的事务管理代码。这个问题时有发生,使服务变得毫无用处。我们的工作方法是重新启动WebLogic服务器,或者将自动提交关闭,然后打开。这种情况几乎每天发生5次。

有什么线索吗?WebLogic是与网络服务代码有关的数据库问题吗?

EN

回答 1

Stack Overflow用户

发布于 2013-05-16 11:03:10

根据注释,这不是一个答案,但是显示了一个例子,如果您的查询在某个时候调用了一个函数,那么可能会发生什么。

代码语言:javascript
复制
create function f42 return number as
begin
    commit;
    return 0;
end;
/

Function created.

SQL> select * from dual where extract(day from sysdate) = 16 or f42 = 0;

D
-
X

这很好,因为今天是第16部分,所以or的第一部分是真的,第二部分不需要计算;所以函数不被调用。就在我要找的那一天:

代码语言:javascript
复制
SQL> select * from dual where extract(day from sysdate) = 15 or f42 = 0;

select * from dual where extract(day from sysdate) = 15 or f42 = 0
                                                           *
ERROR at line 1:
ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML
ORA-06512: at "STACKOVERFLOW.F42", line 3

这一次,or的第一部分是false,所以它确实调用了函数,这会引发错误。

但是,错误堆栈显示了问题的真正来源,除非您捕获(并压缩)堆栈,或者您的客户端没有报告它。直接从SQL*Plus调用包过程将显示整个堆栈,前提是您知道导致问题的参数,而不是压缩错误。

但还不清楚问题是只影响某些参数值,还是基于某些瞬态的(如sysdate),或者确实是由其他完全原因引起的。首先,我想看看您是否可以像这样可靠地复制它,如果可以,那么错误堆栈应该会让您更好地了解正在发生的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16576664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档