对于我的作业,我需要创建一个包含一个过程的包,该过程从表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查询比光标或隐式循环更好。
可能的改进:您应该在没有更新的情况下立即执行:在插入期间设置日期。
INSERT INTO dwdimartist (artistkey, name, added)
(SELECT artistid, name, sysdate FROM artist);
希望能帮助到你
您不需要使用游标。你很难打败Insert ... select因为它本身就是SQL本身,并且在大多数情况下,由于本机dbms优化,它比任何程序结构都更好。但是,如果减少I / O操作次数,则可以做得更好。你不需要在这里更新。只需将sysdate添加到您的选择中并将所有内容插入即可。
insert into dwdimartist(artistkey, name, added) select artistid, name, sysdate from artist;
另一件需要改进的是你的“删除”。虽然它是用于学习目的的小表,但您不会觉得删除和截断之间有任何区别,但对于真正的ETL任务和大表,您肯定会看到它。是的,你不能直接在PL / SQL中使用truncate,但有3种方法可以做到:
但是,请记住,调用truncate将像任何ddl命令一样执行commit。因此有时候删除可能是唯一的选择。但即使是这样,你也应该为整张桌子避开它。