2017-04-01 48 views
1

首先,我創建了一個臨時表爲什麼我無法在臨時表上創建索引?

CREATE GLOBAL TEMPORARY TABLE TMP ON COMMIT PRESERVE ROWS AS 
SELECT * 
FROM A 

然後

INSERT INTO TMP 
SELECT * 
FROM B 

COMMIT 

終於

CREATE INDEX IDX ON TMP (COLA, COLB, COLC); 

在創建索引,我得到了以下錯誤

ORA-14452 :嘗試t o在已使用的臨時表上創建,更改或刪除索引

我在同一個會話中執行了這些步驟。

我想要做的(臨時表)是

  1. 禁用/刪除索引
  2. 插入大數據
  3. 啓用/創建索引

我怎樣才能達致這?

+0

您可能需要在'insert'之後執行提交。 –

+0

仍然得到相同的錯誤... –

+0

該表是永久性的,所以它的索引也應該是永久的。 –

回答

3

ORA-14452:試圖創建,更改或已在使用拖放到臨時表的索引

當它試圖在與全局臨時表執行DDL出現此錯誤提交保存行當試圖執行DDL的會話已經在表上創建了DML時。 爲了執行DDL,必須首先將表格截斷或者必須退出會話。

http://www.adp-gmbh.ch/ora/err/ora_14452.html

1

我不得不承認這個感到吃驚。我到目前爲止提出的唯一解決方案是重新建立會話

SQL> drop table tmp; 

Table dropped. 

SQL> 
SQL> CREATE GLOBAL TEMPORARY TABLE TMP ON COMMIT PRESERVE ROWS AS 
    2 SELECT * 
    3 FROM emp 
    4 ; 

Table created. 

SQL> 
SQL> 
SQL> INSERT INTO TMP 
    2 SELECT * 
    3 FROM emp 
    4 ; 

14 rows created. 

SQL> 
SQL> COMMIT 
    2 ; 

Commit complete. 

SQL> 
SQL> connect scott/tiger 
Connected. 
SQL> 
SQL> CREATE INDEX IDX ON TMP (empno); 

Index created.