为什么COMMIT在执行立即后解决了问题?

时间:2015-04-05 13:58:35

标签: sql oracle alter

BEGIN
     EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE';
     EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML' ;
END;
/

在3个oracle服务器中的1个中出现以下错误。 oracle:11.2.0.4

  

ora 12841无法改变会话内的并行DML状态   交易

但是在添加COMMIT后系统工作正常

BEGIN
     EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE';
     COMMIT;
     EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML' ;
END;
/

添加COMMIT后为什么没有看到这个问题?

2 个答案:

答案 0 :(得分:2)

此:

EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE';

...启动了一个新事务,之后您尝试更改会话并行DML状态。

COMMIT完成了事务并启动了另一个事务,因此您可以更改会话并行DML状态。

此处的交易文档:https://docs.oracle.com/database/121/CNCPT/transact.htm

编辑:可能BEGIN让你感到困惑。在PostgreSQL中,BEGIN启动一个事务:http://www.postgresql.org/docs/9.1/static/sql-begin.html。在Oracle"事务在遇到第一个可执行SQL语句时开始"。

答案 1 :(得分:2)

如果您有一些语句在上述块之前启动任何事务,则会出现此问题。

在我的案例中,从导致错误的同义词中进行了简单的选择。在该事务之后添加提交后,块执行正常。

即使在你的情况下,如果在下面的语句之前添加COMMIT之后执行没有错误,那么肯定会有一些你缺少提交的事务。

COMMIT;  
EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES => TRUE'; 
EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML' ;

对我来说这个链接很有帮助 http://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_admin004.htm#ADMIN12167

谢谢/推荐@DavidAldridge以获得更清晰