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 ошибка ушла. | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |