Как создать структуру глобального типа? 
	   
	     | 
   
 
	
		| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		ulge Участник со стажем
 
  Вступление в Клуб: 02.11.2015
  | 
		
			
				 Вт Май 02, 2017 10:19   Как создать структуру глобального типа? | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Пытаюсь организовать в операции цепочку последовательной обработки источников. Результаты первых запросов выводить в массивы,  потом использовать в следующих запросах среди источников и эти массивы, а 
 
в следующих - предыдущие массивы и другие типы. Но средств нет. 
 
 
1) Хорошо подходит конструкция WITH, которая может проделать всю цепочку запросов без промежуточных массивов, но у нее много недостатков, а главное PL-PLUS не поддерживает ее. Приходится ее использовать в динамическом курсоре со всеми минусами: поддерживать запрос в строке, план запроса почему-то ни одним средством не показывается, оптимизировать тяжело, да и трудно понять, где в огромном запросе проблемы с производительностью. 
 
 
2) Решил передавать данные между запросами через массивы структур, но выяснилось, что запрос может вывести результат в массив любого типа - глобальный, локальный, а вот дальше, в источнике запроса можно использовать только глобальные массивы, с типом элемента либо элементарным, либо созданным через CREATE TYPE. Стал искать, как создать глобальный массив в PL_PLUS. Можно использовать VARRAY(0), он дает глобальный массив. Но как создать нужный тип элемента?? Искал в типе Запись в администраторе словаря, как сделать запись глобальной. Ничего не нашел. НО нашел, что некоторые типы типа Запись (например NUM_NUM, DEPN_GRID) генерят в PL-SQL именно  глобальный тип. Например x [NUM_NUM]%rowtype генерится в  z#num_num#type из интерфейсного пакета типа NUM_NUM. И он создан именно через CREATE TYPE. А  type yy is varray(0) of [NUM_NUM]%rowtype генерится в z#num_num#table - глобальная коллекция глобальных записей. Но как же в админе словаря сказать записи, что я хочу чтобы она была глобальной?? | 
			 
		  | 
	 
	
		  | 
	 
	
		Alkov Профи
 
  Вступление в Клуб: 23.09.2010
  | 
		
			
				 Вт Май 02, 2017 10:57    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				--операции цепочку последовательной обработки источников. 
 
 
Если запросы более-менее однотипные почему не сделать одну таблицу но с иерархическим реквизитом, т.е. ссылающегося на эту же таблицу ?
 
 
--Можно использовать VARRAY(0), он дает глобальный массив. Но как создать нужный тип элемента?
 
Строка - достаточно универсальный тип  
 
 
--но как же в админе словаря сказать записи, что я хочу чтобы она была глобальной??
 
Объявить её в секции Глобальные описания , не то? | 
			 
		  | 
	 
	
		  | 
	 
	
		ulge Участник со стажем
 
  Вступление в Клуб: 02.11.2015
  | 
		
			
				 Вт Май 02, 2017 11:16    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Alkov пишет: | 	 		   Если запросы более-менее однотипные почему не сделать одну таблицу но с иерархическим реквизитом, т.е. ссылающегося на эту же таблицу ?
 
 
Строка - достаточно универсальный тип  
 
 
Объявить её в секции Глобальные описания , не то? | 	  
 
 
Запросы неоднотипные, у них вывод в записи с разными полями.
 
Засунуть запись в строку? Вряд ли это будет быстро работать
 
В какой секции мы не объявили бы структуру в операции PL_PLUS, она все равно будет структурой, определенной в пакете, т.е. локальной.  Запросы такой тип не понимают в источниках. 
 
 
Надо чтобы запись была определена в админе словаря и так настроена, чтобы он сам сгенерил оператор CREATE TYPE для типа и для коллекции элементов данного типа. Тогда массив такого типа можно использовать в источниках запроса. Например тип NUM_NUM - можно, проверял | 
			 
		  | 
	 
	
		  | 
	 
	
		yaffil Профи
 
  Вступление в Клуб: 18.08.2011
  | 
		
			
				 Вт Май 02, 2017 11:35    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | ulge пишет: | 	 		  В какой секции мы не объявили бы структуру в операции PL_PLUS, она все равно будет структурой, определенной в пакете, т.е. локальной.  Запросы такой тип не понимают в источниках. 
 
 | 	  
 
 
А если так:
 
 
    - constants - вычисление выражений, содержащих неявные константы, каковыми
 
      являются глобальные константы пакетов операций и системных пакетов (т.е.
 
      инициализируемые переменные, описанные ключевым словом const). | 
			 
		  | 
	 
	
		  | 
	 
	
		ulge Участник со стажем
 
  Вступление в Клуб: 02.11.2015
  | 
		
			
				 Вт Май 02, 2017 11:56    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | yaffil пишет: | 	 		  
 
А если так:
 
    - constants - вычисление выражений, содержащих неявные константы, каковыми
 
 | 	  
 
 
Это тоже пакет. Запись , объявленная в любом пакете - не объект базы данных, SQL ее не видит | 
			 
		  | 
	 
	
		  | 
	 
	
		Эмиралька Эксперт
 
  Вступление в Клуб: 09.11.2015
  | 
		
			
				 Вт Май 02, 2017 12:14    | 
				     | 
			 
			
				Полезность: 1 
  | 
			 
			
				 	  | ulge пишет: | 	 		  Пытаюсь организовать в операции цепочку последовательной обработки источников. Результаты первых запросов выводить в массивы,  потом использовать в следующих запросах среди источников и эти массивы, а 
 
в следующих - предыдущие массивы и другие типы. Но средств нет. 
 
 
1) Хорошо подходит конструкция WITH, которая может проделать всю цепочку запросов без промежуточных массивов, но у нее много недостатков, а главное PL-PLUS не поддерживает ее. Приходится ее использовать в динамическом курсоре со всеми минусами: поддерживать запрос в строке, план запроса почему-то ни одним средством не показывается, оптимизировать тяжело, да и трудно понять, где в огромном запросе проблемы с производительностью. 
 
 | 	  во-первых, можно сделать представление и читать данные из него.
 
во-вторых, можно сделать два курсора и читать во втором данные из первого.
 
В-третьих, есть &override_cursor из RUNTIME.LIB_CURSOR.
 
 
 	  | ulge пишет: | 	 		  | 2) Решил передавать данные между запросами через массивы структур, но выяснилось, что запрос может вывести результат в массив любого типа - глобальный, локальный, а вот дальше, в источнике запроса можно использовать только глобальные массивы, с типом элемента либо элементарным, либо созданным через CREATE TYPE. Стал искать, как создать глобальный массив в PL_PLUS. Можно использовать VARRAY(0), он дает глобальный массив. Но как создать нужный тип элемента?? Искал в типе Запись в администраторе словаря, как сделать запись глобальной. Ничего не нашел. НО нашел, что некоторые типы типа Запись (например NUM_NUM, DEPN_GRID) генерят в PL-SQL именно  глобальный тип. Например x [NUM_NUM]%rowtype генерится в  z#num_num#type из интерфейсного пакета типа NUM_NUM. И он создан именно через CREATE TYPE. А  type yy is varray(0) of [NUM_NUM]%rowtype генерится в z#num_num#table - глобальная коллекция глобальных записей. Но как же в админе словаря сказать записи, что я хочу чтобы она была глобальной?? | 	  Сделайте вложенный массив (поищите NUM_NUM_ARR в АРМ Администратор словаря, дальше по аналогии). Это обычный ЦФТ-шный "массив", с флажком "вложенный массив" на соответствующей закладке.
 
Именно вложенные массивы генерят оракловские типы
 
 	  | Код: | 	 		  | select * from all_objects o where o.OBJECT_NAME like '%NUM_NUM%'; | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		ulge Участник со стажем
 
  Вступление в Клуб: 02.11.2015
  | 
		
			
				 Вт Май 02, 2017 12:39    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Эмиралька пишет: | 	 		  
 
 
Сделайте вложенный массив (поищите NUM_NUM_ARR в АРМ Администратор словаря, дальше по аналогии). Это обычный ЦФТ-шный "массив", с флажком "вложенный массив" на соответствующей закладке. 
 
Именно вложенные массивы генерят оракловские типы 
 
 
 | 	  
 
 
Да, это помогло. Оказывается создание вложенного массива еще и изменяет на глобальный тип записи, который лежит в основе типа элемента этого массива. А тип самой записи вручную изменить на глобальный похоже нельзя. | 
			 
		  | 
	 
	
		  | 
	 
	
		Эмиралька Эксперт
 
  Вступление в Клуб: 09.11.2015
  | 
		
			
				 Вт Май 02, 2017 14:15    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | ulge пишет: | 	 		  | Да, это помогло. | 	  
 
Вверху сообщения есть кнопка "Оценить"   | 
			 
		  | 
	 
	
		  | 
	 
	
		vtar Эксперт
 
  Вступление в Клуб: 20.03.2009
  | 
		
			
				 Вт Май 02, 2017 17:05    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Эмиралька пишет: | 	 		   	  | ulge пишет: | 	 		  | Да, это помогло. | 	  
 
Вверху сообщения есть кнопка "Оценить"   | 	  
 
 
лучше маленький доллар
 
чем большое спасибо.    | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |