如何在oracle

时间:2016-11-29 23:10:42

标签: sql oracle plsql oracle11g

我有两张不相关的表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中具有old_id的匹配记录的表A中的所有记录是否已正确更新。我可以在update语句之前/之后编写什么查询来验证表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;  

1 个答案:

答案 0 :(得分:0)

我不明白为什么当他们使用OLD_ID时,替换 NEW_ID的数据类型不同:OLD_ID是char和NEW_ID是一个整数。

最好将新字段(列)添加到表中以存储NEW_ID并更新。

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