Как создать структуру глобального типа?
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 пишет: | Да, это помогло. |
Вверху сообщения есть кнопка "Оценить"  |
лучше маленький доллар
чем большое спасибо.  |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|