如何在程序中更新复制PL / SQL的记录

时间:2013-02-11 02:13:45

标签: oracle plsql duplicates

我有一张名为sales_staff_08的表,姓名,用户名为3列。

使用firstname和surname连接

username。

因为它可能是重复的。因此,我想通过添加一些数字来避免。

当前表格

USERNAME   
---------- 
JOHSMITH1 
TOMNGUYE1
STEREDMO1
BOBJOHN1
CARJONES1
DANCREIG1
STEREDMO1
TOMNGUYE1

我想更新重复的RECORD,它应该如下所示:

USERNAME   
---------- 
JOHSMITH1
TOMNGUYE1
STEREDMO1
BOBJOHN1
CARJONES1
DANCREIG1
STEREDMO2
TOMNGUYE2

我第一次尝试更新记录

 CREATE OR REPLACE PROCEDURE proc_concate_names IS 

 vc_username VARCHAR(25);
 v_number NUMBER (2) := 1;

 CURSOR cur_concate_username IS 
 SELECT firstname, surname, username FROM sales_staff_08; 

 BEGIN

    FOR rec_cur_concate IN cur_concate_username 

    LOOP

    vc_username := rec_cur_concate.firstname || rec_cur_concate.surname || v_number;

    UPDATE sales_staff_08 ss
    SET username = vc_username
    WHERE ss.username = rec_cur_concate.username;

 END LOOP; 

 END proc_concate_names;
 /

2 个答案:

答案 0 :(得分:2)

您可以使用一个命令执行此操作:

merge into sales_staff_08 d
using (select firstname ||surname || row_number() 
           over (partition by username order by firstname) un, rowid 
       from sales_staff_08 ) s
on (d.rowid = s.rowid)
when matched then update set d.username = s.un;

Here is a sqlfiddle demo

正如@Plouf所述,这也可以作为更新命令来完成:

update sales_staff_08 d
set d.username = (
  select un from (
    select firstname ||surname || row_number() 
            over (partition by firstname, surname order by firstname) un 
     from sales_staff_08
  ) s
  where s.rowid = d.rowid
)

Here is another sqlfiddle

答案 1 :(得分:2)

A.B.Cade答案更可靠。首先,如果有数百万行,合并和更新将更快地运行。因为在第一种情况下,您使用plsql引擎和sql引擎进行操作。它意味着在plsql引擎的每个循环中,它将调用sql引擎。在第二种情况下,它将使用完全独立的sql引擎,这是更快。