繼續我有使用插入選擇錯誤
INSERT INTO secondtable
(field, field1)
SELECT field, field2
FROM table;
我使用Oracle 9.x和sqldevelopper一些SQL腳本。
當我啓動它們時,在一些插入選擇我得到外鍵錯誤(S)。所以他們沒有插入工作的人。
當出現錯誤並且如果可能顯示或記錄錯誤時,是否可以對oracle進行說明以繼續相同?
繼續我有使用插入選擇錯誤
INSERT INTO secondtable
(field, field1)
SELECT field, field2
FROM table;
我使用Oracle 9.x和sqldevelopper一些SQL腳本。
當我啓動它們時,在一些插入選擇我得到外鍵錯誤(S)。所以他們沒有插入工作的人。
當出現錯誤並且如果可能顯示或記錄錯誤時,是否可以對oracle進行說明以繼續相同?
您不能在ORACLE 9中繼續失敗的基於集合的插入。您必須使語句失效保護,或者接受它將被回滾。
選項:
如果這樣的錯誤是罕見的,嘗試基於集合的努力,並添加異常處理程序,做了基於行的解決方案,如果發生錯誤,並顯示錯誤(或將它們存儲某處進行進一步處理)發生錯誤時。是的,這是重複的努力,但大多數時候會做最有效的操作,當發生錯誤時,它會根據您的決定處理它們。
如果這是一種常見現象,請吸取它並切換到上述的基於行的解決方案。作爲最好的可以優化並希望有一天你能利用的#3)
升級到Oracle 10和採取的DML error logging
不是在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);
優勢,我會調整的腳本來處理這種情況,而不是抑制錯誤。您可以禁用約束,但在啓用約束之前,仍然必須處理不良數據。 – 2011-02-09 19:22:00