2013-03-27 105 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