2013-02-11 2 views
0

У меня есть таблица с именем sales_staff_08 и имя, фамилия, имя пользователя как 3 cols.Как обновить запись, которая дублируется PL/SQL в процедуре

имя пользователя объединено с использованием имени и фамилии.

потому что он может быть дублирован. Поэтому я хочу избежать, добавив некоторое число.

Текущая таблица

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

Я хочу, чтобы обновить запись, которая дублируется, оно должно быть показано, как это:

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; 
/
+0

Я думаю, что вы должны изменить структуру таблиц, в основном для добавления уникального идентификатора для каждого имени, чтобы обновить имя пользователя, где условие с использованием соответствующего id, а не rec_cur_concate.username ,. Или я думаю, что есть возможный способ использования триггера. – ajmalmhd04

+0

Фактически у меня был sales_staff_id как первичный ключ. –

ответ

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

+0

Почему слияние вместо простого обновления? – Plouf

+1

@Plouf, это потому, что я не знаю, как это сделать в ** простом ** обновлении, только очень ** не просто ** обновлении, а IMHO слияние лучше, так как запрос остается чистым. Во всяком случае, поскольку вы бросили вызов, я обновлю свой ответ –

+0

Я честно не вижу большой разницы между слиянием и обновлением ... – Plouf

2

A.B.Cade ответ является более надежным. Во-первых, слияние и обновление будут работать быстрее, если есть миллионы строк. Потому что в первом случае вы используете как двигатель plsql, так и модуль sql для работы. Это означает, что в каждом цикле движка plsql он будет вызывать SQL-движок. Во втором случае он будет использовать полный независимый движок sql, который работает быстрее.

Смежные вопросы