如何删除 table,然后通过 SELECT * 加上一个附加列在 PLSQL 中插入

How to DELETE a table, then INSERT in PLSQL by SELECT * plus an additional column

我想删除 table 的内容,用一个非常冗长的查询中的内容填充它,并添加另一列数据。

我的查询和 table 使用相同的字段名称,但 table 有一个名为 LAST_UPDATED 的附加列。此列需要为每一行更新为 SYSDATE。

到目前为止,我的代码如下所示:

BEGIN
    delete from TABLE;
    insert into TABLE
    SELECT * from
        (Here there is about a thousand lines of code, nested selects, joins, etc);
    commit;
END;

所以当我现在 运行 它时,我得到一个错误,没有足够的值。如何将 LAST_UPDATED 列的值显式设置为 SYSDATE?

(我已经在 TOAD 中将查询作为脚本单独测试(没有删除和插入)并且它 returns 脚本输出所需的值(减去 LAST_UPDATED 列) ).

如果此过程用于临时的非生产清除+重新加载,并且查询没有 return last_updated 列,那么您可以这样做:

BEGIN
    delete from TABLE;
    insert into TABLE
    SELECT x.*, sysdate last_updated from
        (Here there is about a thousand lines of code, nested selects, joins, etc) x;
    commit;
END;
/

但是,这是非常危险的,因为如果您查询的列与 table 的列不匹配(或者如果有人在您不知情的情况下向您的 table 添加了一个列) ,您可能 运行 遇到问题。

更好的方法是明确说明列的名称 - 特别是如果这将在生产中 运行ning - 就像这样:

BEGIN
    delete from TABLE;
    insert into TABLE (col1, col2, col3, ... , last_updated)
    SELECT col1,
           col2,
           col3,
           ...,
           sysdate last_updated
    from
        (Here there is about a thousand lines of code, nested selects, joins, etc) x;
    commit;
END;
/

这样,您就不太可能 运行 由于重新排序 table 列等而出现任何错误。