2013-03-27 112 views
0
create or replace procedure sample 
as 
ID VARCHAR(20); 
BEGIN 
execute immediate 
'CREATE GLOBAL TEMPORARY TABLE UPDATE_COLUMN_NO_TP 
(
NAME VARCHAR2(256) 
)'; 

INSERT INTO UPDATE_COLUMN_NO_TP 
SELECT SRC_PK_COLUMNS.PK_KEY 
    FROM SRC_PK_COLUMNS 
    WHERE NOT EXISTS ( 
    SELECT 1 
    FROM TGT_PK_COLUMNS 
WHERE TGT_PK_COLUMNS.ID = SRC_PK_COLUMNS.ID); 
END; 

錯誤是:創建並插入一行到表中的存儲過程

The table is no exist. 

所以,我要爲這種情況最好的解決方案。在我的存儲過程中,我有10個臨時表。所有這些都是動態創作和插入。

+2

全局臨時表的整點是,你不即時創建它們。你創建一次,然後在需要時使用它們。 (你不能修復那個程序) – Mat 2013-03-27 09:38:24

+0

[如何在oracle存儲過程中創建和使用臨時表?](http://stackoverflow.com/questions/9310860/how-to-create- oracle11存儲過程) – 2013-03-27 11:08:33

回答

1

UPDATE_COLUMN_NO_TP在編譯時不存在,所以你得到了錯誤。
如果您動態創建表,則應該動態訪問它。
並關注Mat對GTT本質的評論。


execute immediate ' 
INSERT INTO UPDATE_COLUMN_NO_TP 
SELECT SRC_PK_COLUMNS.PK_KEY 
    FROM SRC_PK_COLUMNS 
    WHERE NOT EXISTS ( 
    SELECT 1 
    FROM TGT_PK_COLUMNS 
    WHERE TGT_PK_COLUMNS.ID = SRC_PK_COLUMNS.ID 
) 
'; 
+0

好吧,我有一個想法...我將創建10個表,並在需要時使用它們,並在末尾截斷它們...是最好的嗎? – user1990383 2013-03-27 09:44:38

+0

但是,n個用戶將一次訪問存儲過程。對於這種情況,我們可以應用上述說法。 – user1990383 2013-03-27 09:46:09

+0

@ user1990383 - GTT的選項'on commit delete rows',所以它會在提交或回滾時自動截斷。 – 2013-03-27 09:46:29

相關問題