【问题标题】:How to validate data after update in oracle如何在oracle中更新后验证数据
【发布时间】:2016-11-30 07:55:20
【问题描述】:

我有两个不相关的表 A 和 B。

SQL> select * from A;  

OLD_ID           R_ID  
---------- ----------  
TA-BC               1  
TB-BC               2  
TC-BC               3  
TD-BC               4  
TE-BC               5  
TF-BC               6  
TG-BC               7  
                    8  

SQL> select * from B;  


    NEW_ID OLD_ID     S_CD  
---------- ---------- -----  
         1 TA-BC      A  
         2 TB-BC      B  
         3 TC-BC      C  
         4 TD-BC      A  
         5 TE-BC      B  
         6 TF-BC      F  
         7 TG-BC      C  
         8 TH-BC      B 

我需要使用表 B 中的相应“new_id”值更新表 A 中的列“old_id”,其中 A.OLD_ID = B.OLD_ID。

我写了类似下面的东西。表 A 和 B 中的数据大约有 100 万条记录,我在上面给出的记录是样本数据。由于数据量很大,所以每 25k 条记录更新一次并循环提交。

DECLARE  
  v_cnt number := 1;  
BEGIN  
 WHILE v_cnt > 0 LOOP  
   UPDATE /*+ parallel(A 10) */ A a  
   SET a.old_id =  
          (SELECT DISTINCT new_id  
             FROM B b  
            WHERE b.old_id = a.old_id)  
 WHERE     EXISTS  
              (SELECT 1  
                 FROM B b1  
                WHERE b1.old_id = a.old_id and ROWNUM < 25000;  
   v_cnt := SQL%ROWCOUNT;  
   COMMIT;  
 END LOOP;  
END;  
/  

我想知道如何打印更新了多少记录以及如何验证表 A 中的所有记录是否与表 B 中具有 old_id 的匹配记录已正确更新。我可以在更新语句之前/之后编写什么查询来验证表 A“old_id”列是否已使用表 B“new_id”列中的值正确更新

下面是建表脚本。

create table A(old_id varchar2(10),r_id number);  


insert into A values ('TA-BC',1);  
insert into A values ('TB-BC',2);  
insert into A values ('TC-BC',3);  
insert into A values ('TD-BC',4);  
insert into A values ('TE-BC',5);  
insert into A values ('TF-BC',6);  
insert into A values ('TG-BC',7);  
insert into A(r_id) values(8);  
commit;  


create table B(new_id number,old_id varchar2(10),s_cd varchar2(5));  

insert into B values (1,'TA-BC','A');  
insert into B values (2,'TB-BC','B');  
insert into B values (3,'TC-BC','C');  
insert into B values (4,'TD-BC','A');  
insert into B values (5,'TE-BC','B');  
insert into B values (6,'TF-BC','F');  
insert into B values (7,'TG-BC','C');  
insert into B values (8,'TH-BC','B');  
commit;  

【问题讨论】:

  • R_IDS_CD 不需要执行更新。您能解释一下为什么它们会包含在您的问题中吗?如果不需要它们,最好删除它们。

标签: sql oracle plsql oracle11g


【解决方案1】:

我不明白你为什么要替换 OLD_ID NEW_ID 当它们是不同的数据类型时:OLD_ID 是字符,NEW_ID 是整数。

最好在表中添加一个新字段(列)来存储NEW_ID 并更新它。

然后您可以检查旧到新的映射是否已正确执行利用新 id 是使用NEW_ID连接到其他表的正确数据类型这一事实@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2018-06-16
    • 1970-01-01
    • 2021-12-03
    • 2020-11-23
    • 2015-04-20
    相关资源
    最近更新 更多