|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Есть наверное достаточно типичная задача по работе с интервалами. Есть оплаченные пользователями подписки (подписки разной длительности и стоимости). Есть аварии, при которых услуги не предоставлялись, и необходимо посчитать компенсацию. В общем виде нужные мне данные я получаю таким образом (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.
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-запросах как-то очень сложно. Не подскажите альтернативы? Или пример использования коллекций в запросах. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 12:55 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Alibek B.Можно использовать временные таблицы, но их нужно определять (создавать) в базе данных, а я бы не хотел фиксировать структуру этой таблицы (вдруг потребуется добавить или изменить столбцы). Если "вдруг" понадобится - пойдёшь и добавишь. В чём проблема-то?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 13:26 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov В чём проблема-то?.. Таблица в базе данных — это глобальный объект. Если я сделаю какое-то решение с этой временной таблицей, которое будет работать постоянно (например запускаться планировщиком), то при доработках эту таблицу нельзя будет трогать. Локальный объект (как например табличная переменная) удобнее тем, что при доработках кода его можно менять как угодно, нет никаких сторонних зависимостей. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 13:45 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Alibek B.Если я сделаю какое-то решение с этой временной таблицей, которое будет работать постоянно (например запускаться планировщиком), то при доработках эту таблицу нельзя будет трогать. Можно. Погугли "maintenance window". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 13:48 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
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 — Извлечение-Преобразование-Загрузка). Обычные табличные функции требуют создания именованной строки и табличных типов как объектов базы данных ... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 16:24 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Может я неправильно понял? Нагуглил « Managing Automatic System Tasks Using the Maintenance Window ». И как я понял из текста, речь о том, как автоматизировать запуск подобных регулярных задач. Но я такой запуск и со стороны клиента могу обеспечить. Я имел ввиду то, что если я в этой временной таблице удалю или переименую какой-нибудь столбец, то ранее написанный скрипт, работающий с этой таблицей, перестанет работать. То есть если у меня есть уже работающий скрипт версии 1, использующий временную таблицу tmp_queue, а я хочу этот скрипт доработать до версии 2 (и чтобы при этом скрипт версии 1 продолжал работать, пока я не завершу версию 2 и не замещу ею версию 1), то в версии 2 мне нельзя изменять эту временную таблицу tmp_queue, необходимо сделать ее копию tmp_queue_v2 и использовать именно ее. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 16:26 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 16:58 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
SY Public synonym GTT_SYN на GTT_V1 и в коде меняем ссылки на GTT_V1 на GTT_SYN. Идею понял. Видимо так и придется сделать. Но все же табличные переменные удобнее. Я надеялся, что коллекции PL/SQL можно использовать в этой роли. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 17:00 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Alibek B. ....Я надеялся, что коллекции PL/SQL можно использовать в этой роли. что-бы пролюбить всю память на проде? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 17:02 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
mnbvcx pipeline ф-я чем не устраивает? Она ведь будет вызываться (и выполнять сложную выборку данных) при каждом обращении. А я как раз и хочу это предотвратить тем, чтобы один раз сохранить результаты сложного запроса в каком-то буфере (табличной переменной или временной таблице) и в последующих SQL-запросах использовать этот буфер. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 17:03 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev что-бы пролюбить всю память на проде? Так объем данных небольшой. Обычно менее сотни строк. В худшем случае будет менее 20 тысяч строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 17:05 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 17:37 |
|
Аналог табличной переменной из MSSQL (временная материализация резальтата запроса)
|
|||
---|---|---|---|
#18+
Alibek B., а регулярные таблицы вы точно никогда не меняете? ЗЫ: 17 лет работаю с времянками в оракле... указанные выше причины кажутся несколько... надуманными ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 00:10 |
|
|
start [/forum/topic.php?fid=52&fpage=25&tid=1880418]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 401ms |
0 / 0 |