在创建表PL / SQL时立即执行

时间:2017-09-16 15:57:00

标签: sql oracle dynamic-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是一个全局临时表,这就是我选择时没有数据的原因,但是当我运行报表时,输出中有数据。

我正在尝试修复重复数据错误,这就是我需要创建临时表的原因。

1 个答案:

答案 0 :(得分:0)

全局临时表(GTT)中的数据只能由插入它的会话访问;其他会话只会看到自己的数据。这是一个常见的误解,即全球临时表中的数据不是全球性的" - 只有表定义是" global",该表中的数据是插入它的会话的本地数据,并在会话结束时自动清除(或提交,具体取决于GTT的类型)。

如果您的报告查询GTT并查找数据,则必须首先填充全局临时表的进程。

当你运行"创建表"语句(顺便说一句,不需要显式提交),它查询GTT并找不到记录,因为您创建表的会话没有首先使用所需的数据填充GTT。