我有一个与此类似的问题: 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让我悲惨地失败了。
答案 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包含隐式提交,因此不需要显式提交)