如何在PL SQL中使用INSERT INTO SELECT添加日期?

问题描述 投票:0回答:2

对于我的作业,我需要创建一个包含一个过程的包,该过程从表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;
plsql oracle11g oracle-sqldeveloper
2个回答
5
投票

像你这样的简单SQL查询比光标或隐式循环更好。

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

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

希望能帮助到你


1
投票

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

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

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

  1. 执行立即'truncate dwdimartist';
  2. Dbms_utility.exec_ddl_statement('truncate ...;');
  3. DBMS_SQL包

但是,请记住,调用truncate将像任何ddl命令一样执行commit。因此有时候删除可能是唯一的选择。但即使是这样,你也应该为整张桌子避开它。

© www.soinside.com 2019 - 2024. All rights reserved.