【问题标题】:execute immediate in creating a table PL/SQL在创建表时立即执行 PL/SQL
【发布时间】:2018-02-25 14:25:23
【问题描述】:

我只想问为什么这段代码没有建表?

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 是一个全局临时表,这就是为什么我选择时没有数据,但是当我运行报表时,输出有数据。

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

【问题讨论】:

  • 首先,您不需要提交 DDL 操作(创建、更改、删​​除、截断),它们会自动提交。其次,你确定它没有创建表吗?你看起来怎么样?尝试放置要在其上创建表的架构。

标签: sql oracle dynamic-sql


【解决方案1】:

全局临时表 (GTT) 中的数据只能由插入它的会话访问;其他会话只会看到自己的数据。一个常见的误解是全局临时表中的数据不是“全局的”——只有表定义是“全局的”,该表中的数据对于插入它的会话来说是本地的,并在会话结束时自动清除(或提交,取决于它是什么类型的 GTT)。

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

当您运行“创建表”语句(顺便说一下,它不需要显式提交)时,它查询 GTT 并没有发现任何记录,因为您创建表的会话没有首先填充具有所需数据的 GTT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2023-03-31
    • 2018-01-30
    • 2018-02-27
    相关资源
    最近更新 更多