2011-02-09 73 views
1

繼續我有使用插入選擇錯誤

INSERT INTO secondtable 
    (field, field1) 
SELECT field, field2 
    FROM table; 

我使用Oracle 9.x和sqldevelopper一些SQL腳本。

當我啓動它們時,在一些插入選擇我得到外鍵錯誤(S)。所以他們沒有插入工作的人。

當出現錯誤並且如果可能顯示或記錄錯誤時,是否可以對oracle進行說明以繼續相同?

+0

優勢,我會調整的腳本來處理這種情況,而不是抑制錯誤。您可以禁用約束,但在啓用約束之前,仍然必須處理不良數據。 – 2011-02-09 19:22:00

回答

5

您不能在ORACLE 9中繼續失敗的基於集合的插入。您必須使語句失效保護,或者接受它將被回滾。

選項:

  1. 如果這樣的錯誤是罕見的,嘗試基於集合的努力,並添加異常處理程序,做了基於行的解決方案,如果發生錯誤,並顯示錯誤(或將它們存儲某處進行進一步處理)發生錯誤時。是的,這是重複的努力,但大多數時候會做最有效的操作,當發生錯誤時,它會根據您的決定處理它們。

  2. 如果這是一種常見現象,請吸取它並切換到上述的基於行的解決方案。作爲最好的可以優化並希望有一天你能利用的#3)

  3. 升級到Oracle 10和採取的DML error logging

3

不是在Oracle 9i中,沒有。在10.2中,DML error logging被引入,這正是你想要的。

在早期版本中,最常用的方法是做PL/SQL,即

BEGIN 
    FOR src IN (SELECT field1, field2 
       FROM source_table) 
    LOOP 
    BEGIN 
     INSERT INTO destination_table(field1, field2) 
     VALUES(src.field1, src.field2); 
    EXCEPTION 
     WHEN dup_val_on_index 
     THEN 
     <<log the foreign key error>> 
    END; 
    END LOOP; 
END; 

你也可以使用SQL分隔違反外鍵的行,即

INSERT INTO error_table(field1, field2) 
    SELECT field1, field2 
    FROM source_table 
    WHERE NOT EXISTS( 
    SELECT 1 
     FROM parent_table 
     WHERE parent_table.field1 = source_table.field1); 

INSERT INTO destination_table(field1, field2) 
    SELECT field1, field2 
    FROM source_table 
    WHERE EXISTS( 
    SELECT 1 
     FROM parent_table 
     WHERE parent_table.field1 = source_table.field1);