sql >> Database teknologi >  >> RDS >> Oracle

PL/SQL Opdater værdier ved hjælp af DUP_VAL_ON_INDEX

Der er ingen grund til at gennemgå alle posterne i tilfælde af opdateringen. Det er derfor, du får 4 opdateringer i stedet for forventede 2.

I stedet bør du kun opdatere i tilfælde af DUP_VAL_ON_INDEX undtagelse og kun den række, der forårsagede undtagelsen.

Prøv sådan noget.

DECLARE
    ins NUMBER := 0;
    upd NUMBER := 0;
    CURSOR c1 IS
        SELECT cid
        FROM tbl_cust
        WHERE cid 
        IN ('1','2','3','4');
BEGIN
    FOR rec IN c1 LOOP
        begin 
           INSERT INTO tbl2 (id_tbl2, name_tbl2)
           VALUES(rec.cid, DECODE(rec.cid, '1', 'A',
                                        '2', 'B',
                                        '3', 'C',
                                        '4', 'D'));
           ins := ins + 1;
        EXCEPTION   WHEN DUP_VAL_ON_INDEX THEN
           UPDATE tbl2 set name_tbl2 = DECODE(rec.cid, '1', 'A',
                                        '2', 'B',
                                        '3', 'C',
                                        '4', 'D'));
           WHERE cust_cust_code = rec.cid;
           upd := upd + 1;
           continue; 
         end;    
    END LOOP;
        dbms_output.put_line('Updated: ' || upd);
        dbms_output.put_line('Inserted: ' || ins);
END;


  1. Rails + Postgres:Returnerer ikke tidszoneoplysninger på kolonne fra sammenføjet tabel

  2. PostgreSQL:Fuld tekstsøgning - Hvordan søger man delvise ord?

  3. opdele filnavn fra sti i postgres

  4. SQL Server 2008 - HashBytes beregnet kolonne