Plsql 如何在PL SQL中添加插入SELECT的日期?

Plsql 如何在PL SQL中添加插入SELECT的日期?,plsql,oracle11g,oracle-sqldeveloper,Plsql,Oracle11g,Oracle Sqldeveloper,对于我的家庭作业,我需要制作一个包,其中包含一个过程,该过程从表dwdimartist中删除所有记录,然后用表艺术家的所有记录填充该表,并添加一个日期为今天的字段 这是我创造的,它很有效,但我不知道它是否足够有效。使用光标在表中的每条记录上循环是否更好 CREATE OR REPLACE PACKAGE BODY dwh AS PROCEDURE filldwh IS today_date DATE := SYSDATE; BEGIN DELETE FROM dwd

对于我的家庭作业,我需要制作一个包,其中包含一个过程,该过程从表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);

希望它有帮助

像您这样简单的SQL查询比游标或隐式循环更好

可能的改进: 您应该立即执行,无需更新:在插入期间设置日期

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

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

insert into dwdimartist(artistkey, name, added) select artistid, name, sysdate from artist;
另一个需要改进的是“删除”。虽然出于学习目的,它是一个小表,但您不会感觉到delete和truncate之间有什么区别,但对于真正的ETL任务和大表,您肯定会看到它。是的,您不能在PL/SQL中直接使用truncate,但有三种方法:

  • 立即执行“截断DWDIMARTISTER”
  • Dbms_utility.exec_ddl_语句('truncate…;')
  • DBMS_SQL包

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

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

    insert into dwdimartist(artistkey, name, added) select artistid, name, sysdate from artist;
    
    另一个需要改进的是“删除”。虽然出于学习目的,它是一个小表,但您不会感觉到delete和truncate之间有什么区别,但对于真正的ETL任务和大表,您肯定会看到它。是的,您不能在PL/SQL中直接使用truncate,但有三种方法:

  • 立即执行“截断DWDIMARTISTER”
  • Dbms_utility.exec_ddl_语句('truncate…;')
  • DBMS_SQL包
  • 但是,请记住,调用truncate将像任何ddl命令一样执行commit。所以有时候删除可能是唯一的选择。但是,即使是这样,您也应该在整个表中避免使用游标循环。

    游标循环比等效SQL语句性能更好的情况非常罕见。我曾经看到游标提高了性能,很少有游标循环比等价的SQL语句性能更好。我曾经见过游标提高性能。