2017-03-09 236 views
1

更新字段與反我在甲骨文的表是這樣的:在甲骨文

+---------------------------------------------------------------+ 
| 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更新條目空繼續序列(最大+ 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; 

您是否知道解決此問題的另一種方法? 謝謝。

+1

是NIF的主鍵(唯一的,不爲空),或者是它的您想要做一些數學的興趣領域? – zedfoxus

+0

ka_acteur是主鍵, –

+0

我的錯@a_horse_with_no_name –

回答

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;