Oracle

如何擷取執行包含多個 INSERT INTO 語句以插入多行的 SQL 文件期間發生的所有錯誤?

  • April 7, 2020

我有一個包含多個 INSERT 語句的 sql 文件 TW_popul.sql:

INSERT INTO conversion_fee (FEE_ID, FEE_AMOUNT, DISCOUNT_AMOUNT, FEE_TYPE, PAYMENT_ORDER_ID) 
VALUES (32353357, 8.67, 0, 'com.transferwise.fx.payment.fee.RequestFee', 29639547);

INSERT INTO conversion_fee (FEE_ID, FEE_AMOUNT, DISCOUNT_AMOUNT, FEE_TYPE, PAYMENT_ORDER_ID) 
VALUES (32358776, 1.84, 0, 'com.transferwise.fx.payment.fee.RequestFee', 29643922);

INSERT INTO conversion_fee (FEE_ID, FEE_AMOUNT, DISCOUNT_AMOUNT, FEE_TYPE, PAYMENT_ORDER_ID) 
VALUES (32374786, 11.26, 0, 'com.transferwise.fx.payment.fee.RequestFee', 29656743);

INSERT INTO conversion_fee (FEE_ID, FEE_AMOUNT, DISCOUNT_AMOUNT, FEE_TYPE, PAYMENT_ORDER_ID) 
VALUES (32374911, 1.49, 0, 'com.transferwise.fx.payment.fee.RequestFee', 29656849);

其中一些插入語句違反了約束規則並引發錯誤(例如“第 1 行的錯誤:ORA-00001:違反了唯一約束 (TW.BT_BANK_TRANSACTION_ID_PK)”)。

1 row created.


1 row created.


1 row created.

INSERT INTO conversion_fee (FEE_ID, FEE_AMOUNT, DISCOUNT_AMOUNT, FEE_TYPE, PAYMENT_ORDER_ID)
*
ERROR at line 1:
ORA-00001: unique constraint (TW.CF_FEE_ID_PK) violated



1 row created.


1 row created.

如何收集所有產生錯誤的行(例如在 Error_table 中)?

我讀過 TRY… CATCH 但我不確定它是否適用於擷取多個錯誤。

也許更好的方法是驗證記錄是否已經存在並且會違反約束,然後才嘗試插入它。您必須圍繞該文件編寫一些腳本。

另一種可能性是首先將所有內容插入臨時表,然後conversion_fee批量插入表,有選擇地使用 WHERE/IN/EXISTS 子句,而不是逐行插入。臨時表應該只是 的副本conversion_fee,沒有數據和約束。

那麼辨識重複行應該不會太難,例如通過在conversion_fee和臨時表之間進行 JOIN。

使用文本編輯器,您可以輕鬆地將源文件中的表名替換為其他名稱(臨時表的名稱)。將您的文件導入該臨時表,然後與conversion_fee.

我現在不能提供完整的程式碼,因為表結構是未知的,約束也不是。但這是一個想法。

使用 DML 錯誤記錄插入數據

例子:

begin
 DBMS_ERRLOG.CREATE_ERROR_LOG(dml_table_name => 'conversion_fee');
end;
/

這將創建一個名為的表,如果在語句中指定,該err$_conversion_fee表可以收集表的錯誤:conversion_fee``INSERT

INSERT INTO conversion_fee (FEE_ID, FEE_AMOUNT, DISCOUNT_AMOUNT, FEE_TYPE, PAYMENT_ORDER_ID) 
VALUES (32353357, 8.67, 0, 'com.transferwise.fx.payment.fee.RequestFee', 29639547)
LOG ERRORS INTO err$_conversion_fee ('daily_load') REJECT LIMIT UNLIMITED;

引用自:https://dba.stackexchange.com/questions/264499