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

Как создать структуру глобального типа?

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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), он дает глобальный массив. Но как создать нужный тип элемента?
Строка - достаточно универсальный тип Wink

--но как же в админе словаря сказать записи, что я хочу чтобы она была глобальной??
Объявить её в секции Глобальные описания , не то?
ulge
Участник со стажем


Вступление в Клуб: 02.11.2015
СообщениеВт Май 02, 2017 11:16    Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
Если запросы более-менее однотипные почему не сделать одну таблицу но с иерархическим реквизитом, т.е. ссылающегося на эту же таблицу ?

Строка - достаточно универсальный тип Wink

Объявить её в секции Глобальные описания , не то?


Запросы неоднотипные, у них вывод в записи с разными полями.
Засунуть запись в строку? Вряд ли это будет быстро работать
В какой секции мы не объявили бы структуру в операции 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 пишет:
Да, это помогло.

Вверху сообщения есть кнопка "Оценить" Smile
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВт Май 02, 2017 17:05    Ответить с цитатой
Полезность: Нет оценки
Эмиралька пишет:
ulge пишет:
Да, это помогло.

Вверху сообщения есть кнопка "Оценить" Smile


лучше маленький доллар
чем большое спасибо. Very Happy
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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