2011-09-15 17 views

risposta

8

È possibile utilizzare la funzione di registrazione degli errori di Oracle per questo:

In primo luogo è necessario creare una tabella che verrà successivamente conterrà le righe ignorate:

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('YOUR_TABLE', 'YOUR_TABLE_ERROR_LOG'); 

che crea una tabella chiamata YOUR_TABLE_ERROR_LOG per la tabella denominata YOUR_TABLE (ovviamente è necessario farlo una volta sola).

Quando si esegue l'aggiornamento è necessario aggiungere la clausola LOG ERRORS:

UPDATE your_table 
    SET ... 
WHERE ... 
LOG ERRORS INTO YOUR_TABLE_ERROR_LOG ('UPDATE running at '||to_char(sysdate, 'yyyy-MM-dd HH24:MI:SS')) 
REJECT LIMIT UNLIMITED; 

La stringa specificata è un valore arbitrario che consente di identificare l'azione che ha generato gli errori.

Dopo l'aggiornamento è possibile interrogare la tabella YOUR_TABLE_ERROR_LOG per vedere quali errori si sono verificati e perché. Se non sei interessato agli errori, basta semplicemente troncare la tabella dei log degli errori in seguito.

Per maggiori dettagli consultare il manuale:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10008.htm#BCEFBFCD

Modifica 2014-10-27

Poiché Oracle 11.2 c'è un nuovo indizio di nome CHANGE_DUPKEY_ERROR_INDEX che può essere utilizzato per questo scopo. Non ho mai provato questo però.

dettagli nel manuale: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDIFFJE

Per INSERT operazioni v'è un accenno di nome simile IGNORE_ROW_ON_DUPKEY_INDEX:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDEGDDG

Alcuni esempi:

0

È difficile dire definitivamente di no (Oracle è grande) ma in 15 anni di programmazione di database non ho mai visto una funzionalità come questa in Oracle. Puoi disabilitare i vincoli, ma non è la stessa cosa che stai cercando di ottenere qui.

Una soluzione alternativa sarebbe scrivere un PL/SQL che elabora la tabella che si sta aggiornando riga per riga, tenta di effettuare l'aggiornamento e ingoia eventuali errori. Non sarà efficiente, ma funzionerà. Ma in ogni scenario posso immaginare (a meno che tu non abbia una tabella molto, molto complessa) dovresti essere in grado di scrivere la tua query di aggiornamento per includere subquery appropriate che funzionino attorno ai vincoli. La strategia esatta dipenderà dalle tabelle e dalla query.

Problemi correlati