0

一意でないフィールドを更新する必要があります。テーブルtblがあります:

create table tbl (A number(5));

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

しかし、私は得ました:

         A
----------
         1
       100
       ...
       100

何が間違っている可能性がありますか?ループが機能しないのはなぜですか?

4

2 に答える 2

5

どうですか

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

サブクエリは重複した A フィールドを検出し、更新によりそれらに 100 から始まる一意の識別子が与えられます (ID 100、101.... が既に存在する場合など、他の問題が発生します)。

PLSQL の最初のルールは、SQL でできることは常に SQL で行うことです。まっすぐに書くfor loopと、SQLエンジンとpl/SQLエンジンの間でコンテキストスイッチが割り当てられます。Oracle がこれを一括ステートメント (10g<) に自動的に変換したとしても、純粋な SQL の方が高速です。

于 2013-04-09T05:52:51.453 に答える