Проблема наличия одной плохой строки
Проблема наличия “одной плохой строки” при выполнении инструкции вставки с подзапросом довольно типична. Представьте себе ситуацию, в которой нужно вставить 10 тысяч строк по 20 столбцов в каждой, отобранных из множества таблиц, в некоторую другую таблицу. Всего одно значение в одной строке может вызвать срыв операции вставки только по той причине, что оно больше, чем допускается определением столбца. К примеру, если столбец таблицы назначения имеет тип NUMERIC(5), попытка вставить в него число, большее 99999, приведет к срыву всей операции INSERT, даже если до этого она без сбоев продолжалась в течение нескольких часов. Аналогичная проблема может произойти при попытке вставки значения, нарушающего действующие ограничения столбца. Значение NULL нельзя вставить в столбец с ограничением NOT NULL, дублирующиеся величины могут быть отвергнуты ограничениями уникальности или первичного ключа и т. д. К примеру, следующая инструкция не будет выполнена ввиду нарушения ограничения CHECK. Ограничение проверки столбца SALESMAN_STATUS_S определяет всего два допустимых значения: Y и N. Мы же пытаемся вставить символ A. Если его заменить на Y, инструкция будет выполнена Начиная с версии 10gR2 в СУБД Oracle введена функция протоколирования ошибок DML. Если в инструкцию insert, update, delete или merge вставить предложение log errors, при возникновении ошибок инструкция не будет прерываться, при этом сообщение о типе ошибки и строке, на которую она повлияла, будет заноситься с таблицу журнала ошибок. Содержимое таблицы журнала ошибок можно анализировать и позже исправлять обнаруженные ошибки. Однако до начала использования предложения error logging таблицу журнала нужно создать либо вручную, либо с помощью системного пакета dbms_errlog. К примеру, следующая инструкция создаст таблицу ошибок с именем prod_errlog для таблицы product На практике часто удается избежать проблем, связанных с невыполнением всей Совет инструкции DML из-за ошибки в одной строке, с помощью процедурных расширений SQL: Oracle PL/SQL, Microsoft SQL Server T-SQL и DB2 SQL PL. О процедурных расширениях SQL речь пойдет в главе 14.