PRAGMA RESTRICT_REFERENCES
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
markoff Участник - экстремал
Вступление в Клуб: 09.06.2009
|
Вт Окт 05, 2010 12:05  PRAGMA RESTRICT_REFERENCES |
|
Полезность: Нет оценки
|
Код: | PRAGMA RESTRICT_REFERENCES(ИмяФункций, WNDS, TRUST); |
Как такую запись понять и что означают WNDS, WNPS? |
|
 |
svn Профи
Вступление в Клуб: 04.02.2008
|
Вт Окт 05, 2010 13:11   |
|
Полезность: 1
|
это означает что функция не вносит изменения в базу
применяется например для вызова функций из представлений |
|
 |
markoff Участник - экстремал
Вступление в Клуб: 09.06.2009
|
Вт Окт 05, 2010 14:13   |
|
Полезность: Нет оценки
|
svn пишет: | это означает что функция не вносит изменения в базу
применяется например для вызова функций из представлений |
ясно, а как быть с WNDS, WNPS |
|
 |
timochev Эксперт
Вступление в Клуб: 02.07.2007
|
Вт Окт 05, 2010 14:35   |
|
Полезность: 3
|
WNDS = writes no database state
WNPS = writes no package state |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пт Июл 22, 2011 13:44   |
|
Полезность: Нет оценки
|
А еще есть
RNDS - Read No Database State
RNPS - Read No Package State
Ну а TRUST означает "Доверься мне, батька знает, что делает" |
|
 |
ssa774 Профи
Вступление в Клуб: 30.11.2007
|
Пн Апр 07, 2014 10:37   |
|
Полезность: Нет оценки
|
Ситуация: меняем один тип (добавляем реквизит), выполняется перекомпиляция зависимых объектов, ломается операция в другом типе. В глобальных описаниях операции описана функция, к ней идет Код: | PRAGMA RESTRICT_REFERENCES ( ..., WNDS, WNPS ); |
Ошибка в пакете - подпрограмма нарушает свою прагму. Как с этим бороться? |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пн Апр 07, 2014 14:23   |
|
Полезность: Нет оценки
|
ssa774 пишет: | Ситуация: меняем один тип (добавляем реквизит), выполняется перекомпиляция зависимых объектов, ломается операция в другом типе. В глобальных описаниях операции описана функция, к ней идет Код: | PRAGMA RESTRICT_REFERENCES ( ..., WNDS, WNPS ); |
Ошибка в пакете - подпрограмма нарушает свою прагму. Как с этим бороться? |
PRAGMA RESTRICT_REFERENCES ( ..., WNDS, WNPS, trust ); |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Вт Апр 08, 2014 03:09   |
|
Полезность: Нет оценки
|
ssa774 пишет: |
Ошибка в пакете - подпрограмма нарушает свою прагму. Как с этим бороться? |
Да убери ты эту прагму, она не нужна если функцию объявляешь в глобальных описаниях. |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Вт Апр 08, 2014 06:51   |
|
Полезность: Нет оценки
|
Alkov пишет: | ssa774 пишет: |
Ошибка в пакете - подпрограмма нарушает свою прагму. Как с этим бороться? |
Да убери ты эту прагму, она не нужна если функцию объявляешь в глобальных описаниях. |
Не надо писать ерунду. Эту прагму ставят на функции, которые используют в представлениях/запросах. |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Ср Апр 09, 2014 02:42   |
|
Полезность: Нет оценки
|
devor пишет: | Alkov пишет: | ssa774 пишет: |
Ошибка в пакете - подпрограмма нарушает свою прагму. Как с этим бороться? |
Да убери ты эту прагму, она не нужна если функцию объявляешь в глобальных описаниях. |
Не надо писать ерунду. Эту прагму ставят на функции, которые используют в представлениях/запросах. |
С ТЯ 6.4 в этом нет необходимости.
. Разъяснение по поводу использования прагмы RESTRICT_REFERENCES. В версии
Oracle 8 и выше при использовании функций в запросах эту прагму указывать не
обязательно, т.к. Oracle отслеживает выполняемые функцией действия (в случае
динамических запросов это можно сделать только на этапе выполнения), и в случае
выполнения недопустимых действий, генерит исключение. На текущий момент не совсем
понятно, делаются ли указанные проверки в случае явного указания прагмы, возможно,
она как-то все-таки влияет на механизм проверки, упрощая и ускоряя его, хотя
последнее не замечено.
Препроцессором Pl/Plus используются следующие правила для вызовов глобальных
функций в SQL-выражениях:
а) вызовы функций, у которых указана прагма restrict_references (WNDS),
включаются в текст запроса безусловно. Поэтому, если
значения таких функций не зависят от выбираемых записей
в запросе (т.е. не используют обращения к колонкам выбираемых записей),
то рекомендуется пере присвоить значение функции буферной переменной
и в запросе использовать эту переменную (это может значительно ускорить
время выполнения запроса, т.к. значения функции вычисляются на каждую
выбираемую запись в запросе). Если прагма restrict_references (WNDS)
задана только в локальных описаниях, то соответствующая функция PL/SQL
пакета операции такой прагмой обладать не будет.
б) вызовы функций, у которых не указана прагма restrict_references (WNDS),
в случае отсутствия зависимости от выбираемых записей в запросе
(т.е. не используют обращения к колонкам выбираемых записей)
автоматически выносятся из SQL-выражения, т.е. заменяются на используемую
временную буферную переменную, которой предварительно присваивается значение
функции. Если зависимость от выбираемых записей все-таки задана,
то в версиях ТЯ до 6.4 возникает ошибка компиляции, а в версиях
ТЯ 6.4 и выше выдается предупреждение и вызов функций включается
в SQL-выражение. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Апр 09, 2014 10:29   |
|
Полезность: Нет оценки
|
Alkov пишет: | devor пишет: | Alkov пишет: | ssa774 пишет: |
Ошибка в пакете - подпрограмма нарушает свою прагму. Как с этим бороться? |
Да убери ты эту прагму, она не нужна если функцию объявляешь в глобальных описаниях. |
Не надо писать ерунду. Эту прагму ставят на функции, которые используют в представлениях/запросах. |
С ТЯ 6.4 в этом нет необходимости.
|
Я, в общем-то и в 7.3.x.x ядрах ловил невалиды из-за того, что прагмы отсутствовали...
В целом, если к данным БД в функции не обращаешься, можешь ставить свою функцию без прагм. Но только вот если в функции есть перевызов другой функции, в которой ранее не было обращений к БД, а потом появилось... то всё, работавшее ранее, сразу ломается.
Не, вру. Не сразу. Случайным образом. Когда перекомпиляется пакет, содержащий твою функцию. Но факт - вчера всё работало, а сегодня у тебя первый класс.
И всё потому что какой-то "разработчик" посчитал, что прагму нафик ставить не надо.
Вот пример.
В функции был вывод отладки в пайпу. Аналог debug_pipe.
называлась debug_output. Внутри перевызов debug_pipe, всё путём.
Потом отладку доработали. Пишет в файл. Отлично, к БД обращений нет. Функция используется в 100500 местах. То есть не функция даже, а процедура.
А потом понадобилось лог отдать пользователю. Для этого файл надо зарегистрировать. В табличке. А прагму в процедуре не поставили. Странно было - процедура debug_output не предназначена для использования в SQL-запросах.
Да только вот есть функции, которые при ошибочной ситуации пишут отладку. И используются в SQL-запросах. И эти функции - без прагм. Вот они и поломались...
А виноват кто? Кому прилетело по шапке?
Так что сами думайте, а лично для себя я давно вывел правило - если ты пишешь функцию, и планируешь, что её будут выполнять в SQL-запросах, пиши pragma restrict_references! |
|
 |
ssa774 Профи
Вступление в Клуб: 30.11.2007
|
Чт Апр 10, 2014 07:55   |
|
Полезность: Нет оценки
|
Спасибо, проблема решена. Уровень отладки в Админе словаря был установлен в -1, поэтому при компиляции в пакет добавлялись отладочные сообщения rtl.debug, поэтому нарушение прагмы вылезало. После установки уровня в 0 ошибка ушла. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|