CftClub.ru
Клуб специалистов ЦФТ-Банк

PRAGMA RESTRICT_REFERENCES

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 ошибка ушла.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru