插入备份表并添加当前日期

时间:2016-11-29 19:37:17

标签: oracle plsql

我有一个与此类似的问题: Copy Data From One Table To Another AND Adding Additional Data

我有一个生产表,有时包含非ascii字符,我们正在尝试清理这些字符,同时备份所有字段,以便我们可以跟踪清理的内容,创建时间以及维护时间。我通过引用生产表创建了备份表,以便两个表完全相同。

CREATE TABLE acc_nac_bak COMPRESS TABLESPACE sardsm AS
select distinct * from account where acc_id = 1;
delete from acc_nac_bak where acc_id = 1;

当我意识到跟踪清理日期会很好时,我后来改变了表格:

alter table acc_nac_bak add (acc_cleaned_date date default SYSDATE);

然后我尝试了这个:

INSERT INTO acc_nac_bak
VALUES ((SELECT *
FROM account
WHERE regexp_like(acc_address_line_1,'[^ -'||chr(126)||']') OR
regexp_like(acc_address_line_2,'[^ -'||chr(126)||']') OR
regexp_like(acc_address_line_3,'[^ -'||chr(126)||']')OR
regexp_like(acc_address_line_4,'[^ -'||chr(126)||']')OR
regexp_like(acc_address_line_5,'[^ -'||chr(126)||']')OR
regexp_like(acc_name,'[^ -'||chr(126)||']')), SYSDATE);
COMMIT;

但是当我运行时,我得到的错误是没有足够的值。

我需要从生产表(超过35个字段)中获取所有字段到备份表中,其中有非ascii字符,然后添加清理日期。

有没有一种方法可以做到这一点,而不会过多地进入FOR循环或IF ...那么?我的Google-foo让我悲惨地失败了。

2 个答案:

答案 0 :(得分:0)

你可以试试这个

INSERT INTO acc_nac_bak SELECT acc.*,sysdate FROM account acc WHERE regexp_like(acc_address_line_1,'[^ -'||chr(126)||']') OR regexp_like(acc_address_line_2,'[^ -'||chr(126)||']') OR regexp_like(acc_address_line_3,'[^ -'||chr(126)||']')OR regexp_like(acc_address_line_4,'[^ -'||chr(126)||']')OR regexp_like(acc_address_line_5,'[^ -'||chr(126)||']')OR regexp_like(acc_name,'[^ -'||chr(126)||']'); COMMIT;

答案 1 :(得分:0)

这能满足您的需求吗?

create table acc_nac_bak as 
  select  a.*
        ,sysdate as acc_cleaned_date
  from account a
  where regexp_like(acc_address_line_1,'[^ -'||chr(126)||']') or
  regexp_like(acc_address_line_2,'[^ -'||chr(126)||']') or
  regexp_like(acc_address_line_3,'[^ -'||chr(126)||']')or
  regexp_like(acc_address_line_4,'[^ -'||chr(126)||']')or
  regexp_like(acc_address_line_5,'[^ -'||chr(126)||']')or
  regexp_like(acc_name,'[^ -'||chr(126)||']');

(由于DDL包含隐式提交,因此不需要显式提交)