2011-09-15 52 views

回答

8

您可以使用Oracle的錯誤記錄功能此:

首先,你需要創建一個將在後麪包含忽略行的表:

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

,創建一個表稱爲YOUR_TABLE_ERROR_LOG爲表命名YOUR_TABLE(顯然你只需要這樣做一次)。

當你運行你的更新,你需要添加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; 

被指定是幫助你找出產生錯誤動作的任意值的字符串。

更新後,您可以查詢表YOUR_TABLE_ERROR_LOG以查看發生了哪些錯誤和原因。如果您對這些錯誤不感興趣,那麼只需稍後截斷錯誤日誌表即可。

欲瞭解更多詳細信息,請參閱手冊:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10008.htm#BCEFBFCD

編輯 2014年10月27日

由於Oracle 11.2有一個名爲CHANGE_DUPKEY_ERROR_INDEX新的提示,可用於這一目的。我從來沒有嘗試過這一點。

詳細的手冊: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDIFFJE

對於INSERT操作有一個名爲IGNORE_ROW_ON_DUPKEY_INDEX類似的提示:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDEGDDG

一些例子:

0

很難明確地說「不」(Oracle很大),但在15年的數據庫編程中,我從來沒有在Oracle中看到過這樣的功能。您可以禁用約束,但這與您在此嘗試完成的不同。

一種解決方法是編寫一些PL/SQL來處理您逐行更新的表,嘗試進行更新併吞下任何錯誤。這不會有效,但它會起作用。但是在我能想象的每種場景中(除非你有一個非常非常複雜的表),你應該可以編寫更新查詢以包含適合約束的適當子查詢。確切的策略將取決於表格和查詢。