如何在 PL SQL 中添加带有 INSERT INTO SELECT 的日期?

Posted

技术标签:

【中文标题】如何在 PL SQL 中添加带有 INSERT INTO SELECT 的日期?【英文标题】:How to add a date with an INSERT INTO SELECT in PL SQL? 【发布时间】:2017-12-28 17:22:41 【问题描述】:

对于我的作业,我需要制作一个包,其中包含一个过程,该过程从表 dwdimartist 中删除所有记录,然后用表艺术家中的所有记录填充表,并添加一个带有今天日期的字段。

这是我创建的,它可以工作,但我不知道它是否足够高性能。使用在表格艺术家中的每条记录上循环的游标更好吗?

CREATE OR REPLACE PACKAGE BODY dwh AS  

  PROCEDURE filldwh IS
    today_date DATE := SYSDATE;
  BEGIN
    DELETE FROM dwdimartist;

    INSERT INTO dwdimartist (artistkey, name) (SELECT artistid, name FROM artist);
    UPDATE dwdimartist SET added = today_date;
  END filldwh;
END dwh;

【问题讨论】:

游标循环比等效的 SQL 语句性能更高,这是一种非常罕见的情况。我曾经见过游标提高性能。 【参考方案1】:

像您所做的简单 SQL 查询比游标或隐式循环更好。

可能的改进: 您应该在不更新的情况下立即执行:在插入期间设置日期。

INSERT INTO dwdimartist (artistkey, name, added) 
  (SELECT artistid, name, sysdate FROM artist);

希望对你有帮助

【讨论】:

【参考方案2】:

您不需要使用游标。您几乎无法击败 Insert ... select,因为它本身就是 SQL,并且在大多数情况下,由于本机 dbms 优化,它比任何编程结构都工作得更好。但是,如果减少 I/O 操作的数量,您可以做得更好。你不需要在这里更新。只需将 sysdate 添加到您的选择中,然后将所有内容一起插入。

insert into dwdimartist(artistkey, name, added) select artistid, name, sysdate from artist;

另一件需要改进的是你的“删除”。虽然它是用于学习目的的小表,但您不会感觉到删除和截断之间有任何区别,但对于真正的 ETL 任务和大表,您肯定会看到它。是的,您不能直接在 PL/SQL 中使用 truncate,但有 3 种方法可以做到:

    立即执行“截断 dwdimartist”; Dbms_utility.exec_ddl_statement('truncate ...;'); DBMS_SQL 包

但是,请记住调用 truncate 将像任何 ddl 命令一样执行提交。所以有时删除可能是唯一的选择。但即使是这样,你也应该避免在整个表中使用它。

【讨论】:

以上是关于如何在 PL SQL 中添加带有 INSERT INTO SELECT 的日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在pl sql中一起使用Select max和Insert

Pl/Pgsql,将数组参数传递给 INSERT

“如何修复 oracle pl/sql 中的触发器?

pl/sql 执行sql语句的时候总是在初始化?

Oracle 批量插入数据怎么做

如何使用计算值更新带有 PL\SQL 的列