Предоставление комплексного значения по умолчанию для таблицы, участвующей в Parallel DML - PullRequest
1 голос
/ 16 марта 2011

У меня есть несколько таблиц, участвующих в операторе слияния, который выполняется параллельно. Слияние выводит в таблицу ошибок, которая генерируется с помощью функции DBMS_ERRLOG.CREATE_ERROR_LOG. Оператор работает отлично, и слияние работает.

Затем я добавил дополнительный столбец в таблицу ошибок, и он продолжает работать без проблем.

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

  • Я попытался заполнить значение с помощью триггера, но затем он помещает триггер в таблицу, включенную в параллельный DML, что недопустимо, и при объединении выдается ошибка. (Это вызывает досадные ошибки)
  • Я попытался добавить значение по умолчанию на основе функции pl / sql - это недопустимо.
  • Я попытался добавить значение по умолчанию на основе оператора sql - это опять не разрешено.

Я мог бы реализовать дополнительную постобработку обновления, чтобы заполнить столбец, но тогда это должно было бы быть сделано для каждой таблицы, которую я объединяю, и это действительно немного хакерство - когда система расширяется, об этом нужно помнить для каждая таблица ошибок. Заполнение значения по умолчанию является предпочтительным подходом.

Как обойти ограничение Oracles PDML для триггера, чтобы заполнить это значение на основе фактически оператора select.

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Поскольку значение звучит довольно статично, посмотрите на SYS_CONTEXT.Например, у меня есть таблица журналов, где я храню работающий в данный момент модуль (установлен с DBMS_APPLICATION_INFO).

имя_ столбца VARCHAR2 (256) DEFAULT SYS_CONTEXT ('USERENV', 'MODULE'),

Не уверен, хранится ли обычное значение контекста для сеанса или процесса.Если это не работает для параллельной обработки, проверьте ГЛОБАЛЬНЫЙ КОНТЕКСТ ПРИМЕНЕНИЯ , который вы можете применить ко всем сеансам для данного имени пользователя

2 голосов
/ 16 марта 2011

Это кажется немного за рамками того, что таблицы ошибок DML предназначены делать изначально, и тогда да - параллельные правила DML собираются лишить вас других возможностей.Самый простой способ решить эту проблему - добавить эту дату пакетной обработки в исходную таблицу, чтобы она также отражалась в таблице ошибок.Это стоит вам немного памяти, но если вам все равно нужно идентифицировать строки по пакетам ....

Или, как вы упомянули, существует пост-процессное решение.Наконец, возможно, есть способ наложить эту информацию на представление, которое перекрывает таблицу ошибок, когда вы смотрите на ошибки?Или дату партии невозможно рассчитать позже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...