Oracle:更新非唯一字段

Yul*_*aya 0 oracle plsql loops

我需要更新一个非唯一字段.我有一个表tbl:

create table tbl (A number(5));
Run Code Online (Sandbox Code Playgroud)

tbl中的值:1,2,2,2 .. 2.

我需要用新的非唯一值替换所有2

新值:1,100,101,102,103 ..我写道:

DECLARE
    sql_stmt VARCHAR2(500);
   cursor curs is 
        select A from tbl group by A having count(*)>1;
   l_row curs%ROWTYPE;
   i number(5);
   new_mail VARCHAR2(20);
BEGIN
  i:=100;
  open curs;
  loop
    fetch curs into l_row;
    exit when curs%notfound; 
    SQL_STMT := 'update tbl set a='||i||' where a='||l_row.A;
    i:=i+1;
    EXECUTE IMMEDIATE sql_stmt;
  end loop;
  close curs;
END;
/
Run Code Online (Sandbox Code Playgroud)

但我得到了:

         A
----------
         1
       100
       ...
       100
Run Code Online (Sandbox Code Playgroud)

有什么不对?为什么循环不起作用?

hak*_*aki 5

关于什么

update tbl
set a = 100 + rownum 
where a in (
    select a 
    from    tbl 
    group by a
    having count(*) > 1 )
Run Code Online (Sandbox Code Playgroud)

子查询找到重复的A字段,更新为它们提供从100开始的唯一标识符.(这里有其他问题,如果id 100,101 ....已经存在).

PLSQL的第一条规则说,使用SQL可以做的事总是使用SQL.直接写入for loop导致sql和pl/sql引擎之间的上下文分配切换.即使oracle自动将其转换为批量语句(10g <),纯SQL仍然会更快.