2017-09-16 141 views
2

我只想問爲什麼這段代碼不會創建表?立即執行創建表PL/SQL

BEGIN 
    EXECUTE IMMEDIATE 'create table temp1 as (select * from table)'; 
    COMMIT; 
END; 

當我嘗試這個,它創建表,但沒有記錄/數據。

BEGIN 
    EXECUTE IMMEDIATE 'drop table temp1'; 
    EXECUTE IMMEDIATE 'create table temp1 as (select * from table)'; 
    COMMIT; 
END; 

table是一個全局臨時表,這就是爲什麼沒有數據時,我選擇,但是當我運行報告,輸出具有數據。

我想解決一個重複的數據錯誤,這就是爲什麼我需要創建臨時表。

+0

首先,你並不需要提交DDL操作(創建,修改,刪除,截斷),他們自動提交。其次,你確定它沒有創建表格嗎?你看起來怎麼樣?嘗試放置要在其上創建表的模式。 –

回答

0

全局臨時表(GTT)中的數據只能被插入它的會話訪問;其他會話將只能看到他們自己的數據。這是一個普遍的誤解,在全局臨時表中的數據是不是「全球性」 - 只表的定義是「全球性」,該表中的數據是局部的插入它的會話,並自動清除在會話結束時(或提交,取決於它是什麼類型的GTT)。

如果您的報表查詢一個GTT和發現數據,一定有它首先填充全局臨時表的過程。

當您運行「create table」語句(順便說一句,它不需要顯式提交)時,它查詢GTT並且沒有找到記錄,因爲您創建表的會話沒有先填充帶有所需數據的GTT。