如何在 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 的日期?的主要内容,如果未能解决你的问题,请参考以下文章