powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
13 сообщений из 13, страница 1 из 1
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047092
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть наверное достаточно типичная задача по работе с интервалами.
Есть оплаченные пользователями подписки (подписки разной длительности и стоимости).
Есть аварии, при которых услуги не предоставлялись, и необходимо посчитать компенсацию.
В общем виде нужные мне данные я получаю таким образом (P - подписки, R - аварии):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
with P as
(
  select 0 P, 0 V, 0 P1, 0 P2 from dual where 0=1
  union all select 1, 100, 08, 14 from dual
  union all select 2, 100, 24, 27 from dual
  union all select 3, 100, 18, 22 from dual
  union all select 4, 100, 12, 30 from dual
  union all select 5, 100, 13, 19 from dual
  union all select 6, 100, 19, 25 from dual
  union all select 7, 100, 12, 16 from dual
  union all select 8, 100, 16, 20 from dual
  union all select 9, 100, 20, 24 from dual
)
, R as
(
  select 0 R, 0 R1, 0 R2 from dual where 0=1
  union all select 1, 16.0, 23.0 from dual
  union all select 2, 16.1, 16.2 from dual
)
select R.*, R2-R1 as RL, P.*, P2-P1 as PL
, least(R2,P2) - greatest(R1,P1) as LL
, greatest(R1,P1) as L1
, least(R2,P2) as L2
, round((least(R2,P2) - greatest(R1,P1))/(P2-P1), 3) as K
, trunc(V * (least(R2,P2) - greatest(R1,P1))/(P2-P1)) as F
from P left join R on not (R1 >= P2 or R2 < P1)
order by R, P


RR1R2RLPVP1P2PLLLL1L2KF1162373100182244182211001162374100123018716230,38938116237510013196316190,550116237610019256419230,66766116237810016204416201100116237910020244320230,7575216,116,20,141001230180,116,116,20,0060216,116,20,15100131960,116,116,20,0171216,116,20,18100162040,116,116,20,025211008146210024273710012164
Визуальное представление этого запроса нарисовано в аттаче.
Версия Oracle 10g.

В реальной задаче некоторые моменты усложняют ее решение.
Во-первых, подписки приходится получать достаточно "тяжелым" запросом, не всегда покрываемым индексами. Хотя результат запроса как правило небольшой, десятки (в худшем случае тысячи) записей.
Во-вторых, компенсация — это перечень определенных действий. Можно выполнять эти действия в цикле (с использованием курсора). Но мне кажется, что эффективнее использовать update/merge с определенными группами подписок (критерии которых будут добавляться в where). Но тогда нужно будет выполнять "тяжелые" запросы несколько раз, для каждой группы.

Было бы удобно сохранить полученный набор данных во временную коллекцию и в дальнейшем использовать ее в SQL-запросах (добавляя join и where).
Можно использовать временные таблицы, но их нужно определять (создавать) в базе данных, а я бы не хотел фиксировать структуру этой таблицы (вдруг потребуется добавить или изменить столбцы).
В PL/SQL есть коллекции, но использовать их в SQL-запросах как-то очень сложно.
Не подскажите альтернативы? Или пример использования коллекций в запросах.
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047107
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Можно использовать временные таблицы, но их нужно определять (создавать) в базе данных, а
я бы не хотел фиксировать структуру этой таблицы (вдруг потребуется добавить или изменить
столбцы).

Если "вдруг" понадобится - пойдёшь и добавишь. В чём проблема-то?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047122
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

В чём проблема-то?..

Таблица в базе данных — это глобальный объект.
Если я сделаю какое-то решение с этой временной таблицей, которое будет работать постоянно (например запускаться планировщиком), то при доработках эту таблицу нельзя будет трогать.
Локальный объект (как например табличная переменная) удобнее тем, что при доработках кода его можно менять как угодно, нет никаких сторонних зависимостей.
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047125
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Если я сделаю какое-то решение с этой временной таблицей, которое будет работать постоянно
(например запускаться планировщиком), то при доработках эту таблицу нельзя будет трогать.

Можно. Погугли "maintenance window".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047203
mnbvcx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.

Локальный объект (как например табличная переменная) удобнее тем, что при доработках кода его можно менять как угодно, нет никаких сторонних зависимостей.

pipeline ф-я чем не устраивает?
https://www.fors.ru/upload/magazine/07/http_text/w_dev_pipelined_tf.html

Табличные функции используются для возврата PL/SQL-коллекций, которые имитируют таблицы. Они могут быть запрошены как обычные таблицы с помощью функцию TABLE во фразе FROM. Обычные табличные функции требуют, чтобы коллекции перед возвращением были полностью наполнены (населены). Так как коллекции хранятся в памяти, это может стать проблемой, поскольку на большие коллекции впустую тратится много памяти и времени в ожидании возвращения первой строки. Эти узкие возможности делают обычные табличные функции непригодными в случаях масштабных ETL-операций (ETL — Extraction Transformation Load — Извлечение-Преобразование-Загрузка). Обычные табличные функции требуют создания именованной строки и табличных типов как объектов базы данных ...
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047205
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я неправильно понял?

Нагуглил « Managing Automatic System Tasks Using the Maintenance Window ». И как я понял из текста, речь о том, как автоматизировать запуск подобных регулярных задач. Но я такой запуск и со стороны клиента могу обеспечить.
Я имел ввиду то, что если я в этой временной таблице удалю или переименую какой-нибудь столбец, то ранее написанный скрипт, работающий с этой таблицей, перестанет работать.
То есть если у меня есть уже работающий скрипт версии 1, использующий временную таблицу tmp_queue, а я хочу этот скрипт доработать до версии 2 (и чтобы при этом скрипт версии 1 продолжал работать, пока я не завершу версию 2 и не замещу ею версию 1), то в версии 2 мне нельзя изменять эту временную таблицу tmp_queue, необходимо сделать ее копию tmp_queue_v2 и использовать именно ее.
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047222
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Private temporary tables - но ты, насколько я помню, на древней версии. Посему играйся с синонимами. Public synonym GTT_SYN на GTT_V1 и в коде меняем ссылки на GTT_V1 на GTT_SYN. Разработчик создает свою GTT_V2 и private synonym GTT_SYN на GTT_V2. Когда новый код готов CREATE OR REPLACE PUBLIC SYNONYM GTT_SYN FOR GTT_V2;

SY.
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047224
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Public synonym GTT_SYN на GTT_V1 и в коде меняем ссылки на GTT_V1 на GTT_SYN.

Идею понял.
Видимо так и придется сделать.
Но все же табличные переменные удобнее. Я надеялся, что коллекции PL/SQL можно использовать в этой роли.
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047230
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.

....Я надеялся, что коллекции PL/SQL можно использовать в этой роли.

что-бы пролюбить всю память на проде?
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047233
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mnbvcx
pipeline ф-я чем не устраивает?

Она ведь будет вызываться (и выполнять сложную выборку данных) при каждом обращении.
А я как раз и хочу это предотвратить тем, чтобы один раз сохранить результаты сложного запроса в каком-то буфере (табличной переменной или временной таблице) и в последующих SQL-запросах использовать этот буфер.
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047238
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
что-бы пролюбить всю память на проде?

Так объем данных небольшой. Обычно менее сотни строк. В худшем случае будет менее 20 тысяч строк.
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047263
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.То есть если у меня есть уже работающий скрипт версии 1, использующий временную таблицу
tmp_queue, а я хочу этот скрипт доработать до версии 2 (и чтобы при этом скрипт версии 1
продолжал работать, пока я не завершу версию 2 и не замещу ею версию 1), то в версии 2 мне
нельзя изменять эту временную таблицу tmp_queue, необходимо сделать ее копию tmp_queue_v2
и использовать именно ее.

Нет, ты просто разрабатываешь версию 2 на сервере разработки, потом делаешь скрипт
апгрейда, который одновременно замещает версию скрипта и модифицирует временную таблицу,
тестируешь этот скрипт на тестовом сервере, а потом выполняешь его на боевом сервере с
пределах maintenance window, когда с ним никто не работает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
    #40047616
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

а регулярные таблицы вы точно никогда не меняете?


ЗЫ: 17 лет работаю с времянками в оракле... указанные выше причины кажутся несколько... надуманными
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]