DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

pls-00436 удалена в oracle 11g


Начиная с версии в Oracle 8i, было неприятное ограничение с FORALL: PLS-00436 "ограничение выполнения". Читатели, которые знакомы с FORALL, знают о PLS- 00436. Это - ограничение выполнения, которое препятствует тому, чтобы мы получили доступ к определенным атрибутам записи в пределах FORALL DML-конструкции. Одна из первых вещей, которые я проверяю всякий раз, когда выходит новая версия Oracle, - было ли это ограничение удалено. С версии 11 г это наконец произошло, и эта небольшая статья продемонстрирует методы, которые теперь доступны для нас.

Используя примеры из этой статьи, мы выполним простое обновление на колонке в EMP, использующем FORALL. Это будет сделано только в демонстрационных целях : при обычных обстоятельствах код был бы достаточно сложен. 
Пример:
В версиях до 11g строки 16 и 17 вызвали бы ошибку PLS-00436, потому что они ссылаются на атрибуты в записи EMP (или если быть точными, атрибуты каждого элемента записи EMP в пределах ассоциативного массива). 

Реализация для insert


Удаление PLS-00436 ограничений упрощает несколько областей кодирования PL/SQL FORALL, включая вставки. Insert FORALL, которые вовлекают частичный набор целевых колонок, могут быть достигнуты в предыдущих версиях, используя основанную на записи вставку в действующее представление по целевой таблице (8i, у альтернативы должно было бы быть множество для каждой целевой колонки). Удаление PLS-00436 убирает необходимость в таких кодирующих методах, как бы то ни было. Мы можем теперь использовать простые списки значений(), что мы будем видеть ниже.
Мы можем теперь населить подмножество целевых колонок, используя "традиционную" ВСТАВКУ. Утверждение VALUES в нашей конструкции FORALL, не нуждается теперь в любых искусственных приемах, как показано ниже.

row-based updates


Oracle 9i добавил основанные на записях вставки и обновления для PL/SQL (описанный здесь). Основанные на записях вставки удобны, так как имеют дело со всеми целевыми записями или как рабочее пространство к PLS-00436 (до 11g конечно). Основанные на записях обновления, определенные синтаксисом SET ROW, оказалось, были менее полезными с FORALL из-за PLS-00436. Одна из причин - то, что мы не можем ограничить обновления без дополнительных массивов для хранения ключей для каждого целевого обновления

Удаление PLS-00436 ограничений означает, что синтаксис SET ROW более доступен чем в предыдущих версиях. У нас все еще есть проблема обновлений ко всем колонкам, включая первичный ключ. Следующий короткий пример демонстрирует эту технику
В версиях до 11g включение предиката в строке 17 должно было быть подано отдельным множеством. 11g делает это намного более простым.

Заключение


Один из искусственных приемов к PLS-00436 ограничениям в предыдущих версиях должен был использовать типы объекта SQL вместо типов записи PL/SQL и использовать функцию TREAT, чтобы получить доступ к отдельным атрибутам. Теперь, когда PLS-00436 ограничений были удалены, мы сравним работу с новым, более простым синтаксисом. Чтобы позволить нам сделать это, мы создадим таблицу EMP_LARGE с 100 000 записей следующим образом.


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

В итога посмотрим на сравнительные данные



 


ticketline.ru: заказ жд билетов, билет на поезд купить.







jAntivirus