2015-04-05 132 views
4
BEGIN 
    EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE'; 
    EXECUTE IMMEDIATE 'ALTER SESSION DISABLE PARALLEL DML' ; 
END; 
/

3个oracle服务器中有1个出现跟随错误。甲骨文:11.2.0.4为什么COMMIT在立即执行后解决了问题?

ORA 12841不能改变会话并行DML状态 交易

内,但凯明

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

加入后的系统工作得很好,为什么没有看到问题添加COMMIT后?

回答

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更加清晰

2

此:

EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE'; 

...开始一个新的事务,之后就试图改变会话并行DML状态。

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

文件放在这里交易:https://docs.oracle.com/database/121/CNCPT/transact.htm

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

+0

如果凯明是必须有那么为什么它不是在所有Oracle服务器打破。此问题仅在1台服务器中出现,而其他服务器中的COMMIT没有COMMIT的情况下语句正常工作。 – touchchandra 2015-04-05 14:43:25

+1

嗯,我不知道是否可能是“ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE”不是什么启动交易,但另一个声明之前呢?如果在一台服务器上前面的语句没有被执行,那么它就可以解释不同之处。 – 2015-04-05 14:47:13

+0

你可能会尝试连接到数据库,执行COMMIT,执行“SELECT XID FROM V $ TRANSACTION;”,然后“ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE”,然后选择“XID FROM V $ TRANSACTION;”再次。发布select语句返回的内容。 – 2015-04-05 14:49:50