我在Oracle中有一个像这样的表:
+---------------------------------------------------------------+
| KA_ACTEUR | NIF | NIF_EXT | NAME | LASTNAME |
+---------------------------------------------------------------+
| AAAAAAAA1 | 123456789X | 1 | JHON | DOE |
| AAAAAAAA2 | 123456789X | 2 | JHON | DOE |
| AAAAAAAA3 | 123456789X | 3 | JHON | DOE |
| AAAAAAA34 | 123456789X | | JHON | DOE |
| AAAAA6AA5 | 123456789X | | JHON | DOE |
+---------------------------------------------------------------+
The field NIF is the Primary key
我想用EXT字段更新条目为空,继续序列(max + 1)。 我使用了以下代码,但是有很多条目,需要花费很多时间。
DECLARE
CURSOR clientCursor IS
SELECT * from my_table
where nif_ext is null;
BEGIN
FOR client IN clientCursor LOOP
UPDATE my_table
SET nif_ext = (select nvl(max(nif_ext)+1,1) from my_table where nif=client.nif)
WHERE ka_acteur=client.ka_acteur;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
你知道另一种解决方法吗? 感谢。
答案 0 :(得分:0)
这可以使用merge
声明来实现:
merge into my_table
using
(
select ka_acteur,
(select max(nif_ext) from my_table) as max_nif,
row_number() over (order by ka_acteur) as rn
from my_table
where nif_ext is null
) t on (t.ka_acteur = my_table.ka_acteur)
when matched then
set nif_ext = t.max_nif + t.rn;