Oracle
如何擷取執行包含多個 INSERT INTO 語句以插入多行的 SQL 文件期間發生的所有錯誤?
我有一個包含多個 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
.我現在不能提供完整的程式碼,因為表結構是未知的,約束也不是。但這是一個想法。
例子:
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;