Вопрос по sql – Продолжение вставки в Oracle при возникновении исключения

3

Я работаю над миграцией данных из прежней системы в наше новое приложение (работает на базе данных Oracle, 10gR2). В рамках миграции я работаю над сценарием, который вставляет данные в таблицы, используемые приложением.

Количество импортируемых строк данных исчисляется тысячами, а исходные данные не являются чистыми (неожиданные значения NULL в столбцах NOT NULL и т. Д.). Таким образом, при вставке данных через сценарии, когда возникает такое исключение, сценарий внезапно завершается, и вся транзакция откатывается.

Есть ли способ, с помощью которого я могу продолжить вставку данных, для которых строки чистые? С помощьюNVL() или жеCOALESCE() это не вариант, так как я хотел бы регистрировать строки, вызывающие ошибки, чтобы данные могли быть исправлены для следующего прохода.

РЕДАКТИРОВАТЬ: моя текущая процедура имеет обработчик исключений, я записываю первую строку, которая вызывает ошибку. Было бы возможно, чтобы вставки продолжались без завершения, потому что прямо сейчас для первого обработанного исключения процедура прекращает выполнение.

Ваш Ответ

5   ответов
0

Если вы используете sqlldr, вы можете указать, продолжать ли загружать данные и все «плохие» данные. данные будут пропущены и записаны в отдельный файл.

4

Попробуй это:

for r_row in c_legacy_data loop
  begin
    insert into some_table(a, b, c, ...)
    values (r_row.a, r_row.b, r_row.c, ...);
  exception
    when others then 
      null;  /* or some extra logging */
  end;
end loop;
9

Если бы объемы данных были выше, построчная обработка в PL / SQL, вероятно, была бы слишком медленной. В этих обстоятельствах вы можете использовать протоколирование ошибок DML, описанноеВот

CREATE TABLE raises (emp_id NUMBER, sal NUMBER 
   CONSTRAINT check_sal CHECK(sal > 8000));

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('raises', 'errlog');

INSERT INTO raises
   SELECT employee_id, salary*1.1 FROM employees
   WHERE commission_pct > .2
   LOG ERRORS INTO errlog ('my_bad') REJECT LIMIT 10;

SELECT ORA_ERR_MESG$, ORA_ERR_TAG$, emp_id, sal FROM errlog;

ORA_ERR_MESG$               ORA_ERR_TAG$         EMP_ID SAL
--------------------------- -------------------- ------ -------
ORA-02290: check constraint my_bad               161    7700
 (HR.SYS_C004266) violated
Error: User Rate Limit Exceeded Sathyajith Bhat
1
DECLARE
   cursor;
BEGIN
    loop for each row  in cursor
      BEGIN  -- subBlock begins 
         SAVEPOINT startTransaction;  -- mark a savepoint
 -- do whatever you have do here
         COMMIT;         
      EXCEPTION
         ROLLBACK TO startTransaction;  -- undo changes
      END;  -- subBlock ends
   end loop;
END;
5

Используя PLSQL, вы можете выполнять каждую вставку в отдельной транзакции (COMMIT после каждой) и регистрировать или игнорировать ошибки с помощью обработчика исключений, который продолжает работать.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Sathyajith Bhat
Error: User Rate Limit Exceeded Sathyajith Bhat

Похожие вопросы