Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Искал решение одного вопроса и наткнулся на сообщение Влада Хорсуна (правильно перевёл?) о том, что он хотел внести предложение использовать конструкцию execute block в CTE. Однако больше об этом что-то ничего нигде не упоминалось (гугл не нашел). Вот интересно: в данном направлении есть какие-нибудь движения? Или решили что это пижонство? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2014, 11:47 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев, не видел такого. А для чего это потребовалось. Может есть другие способы решения. Например в тройке внутри EXECUTE BLOCK разрешено в секции DECLARE объявлять локальные подпроцедуры и подфункции. P.S. В 12 оракле что типа такого есть Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2014, 12:06 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболевв данном направлении есть какие-нибудь движения?Пока нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2014, 12:21 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Требовалось сделать выборку из таблиц на основе другой таблицы, и к результату применить группировку с агрегацией. Один из вариантов - дополнительная ХП. Не хотелось её рисовать, но, видимо, никуда не денешься, придёться ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2014, 14:47 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Говнодизайн БД detected. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2014, 14:58 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Возвращаяст к говнодизайну (переделывать никто не даст). Этот проект - журнал ремонтов оборудования на заводе. Есть таблица ремонтов. Она активно использует справочники и немного уникальной информации, как-то дата проведения ремонта, тип работ и другие мелочи (поля - указатели на соответствующие записи в справочниках). Так-же есть пара вспомогательных таблиц на орбите, данные которых соотносятся с таблицей ремонтов в отношении многие ко многим. Справочник оборудования выполнен в виде дерева вида: ID_оборудования, ID_предка, название_оборудования, другие_мелочи. Нужно получить аггрегированную информацию (sum, count) из этих орбитальных таблиц причем с ограничением по конкретному оборудованию и конкретному пользователю. При атаке "в лоб" - вывод данных за месяц по одному параметру производится от 1 минуты до 4, при этом в месяц происходит примерно 700-1000 ремонтов. Это неприемлимо долго. Выяснил, что поиск по оборудованию от корня к листьям в данном случае не подходит. Обратный поиск заметно быстрее, но тогда возникает проблема с аггрегацией данных в рамках одного запроса/одной ХП. Текущее решение состоит из ХП выдающей промежуточный результат, и SQL запроса, собирающий итог из данных возвращаемых этой ХП. В ХП имеется 2 вложенных for select. Вопрос: можно ли не прибегая к внешним запросам или ХП, в рамках одной процедуры получить агрегированные данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 10:28 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев, ты запросик сюда кинь, может чего и подскажут. Необязательно свой оригинальный запрос. Можно что попроще для примера. В тройке можно попробовать через оконные функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 10:35 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Переработанный вариант общего итога (без орбитальных таблиц) Хранимка: Код: 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. 28. 29. 30. ну и запрос соответствующий Код: sql 1. 2. 3. Хранимка (долгий вариант) для одной из орбитальных таблиц: Код: sql 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. 28. 29. 30. 31. 32. сломал уже голову, как можно это переделать чтобы быстро работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 10:51 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев, кто тебе мешает считать суммы в самом цикле for select, а потом просто лишний suspend воткнуть типа такого Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 11:50 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, да собственно, ничего не мешает. Была такая мысль. Вот только не помню, почему не реализовал (отказался). Это наверно от усталости. Надо отпуск брать и в горы уходить на недели две... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 11:59 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Вспомнил почему! o_dev_id и v_dev_id они разные и o_dev_id не идут подряд. Значит надо организовывать что-то вроде массива, что не есть хорошо. Сервер сам как-то это считает (наверно сортирует результат). Вот и как мне организовать эту сортировку? Там разброс может равновероятным на всем отрезке. И с повторами само собой. В общем не получится внутри второго цикла это считать ибо сортировку не сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:10 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев, можно сначала загнать предварительные результаты в GTT и затем считать по ней или в трёшке использовать SUM(PARTITION BY <нужные поля группировки>) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:13 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, трёшка пока не рассматривается совсем (бета, и переносить проект - отдельный вопрос, возможно получиться и дизайн сменить), а вот насчет GTT - что-то не получается. Мож чего не правильно делал? Можно пример, стопудово рабочий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:38 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев, а в чём проблема. Создаёшь GTT нужной структуры. GTT создаётся заранее а не динамически в ХП. Затем делаем так INSERT INTO MY_GTT(<поля>) SELECT ... // твой сложный запрос и далее SELECT ... FROM MY_GTT // с нужными обработками тут главный плюс MY_GTT можно соединять много раз и при этом сложный запрос не перевыполняется. Т.е. в данном случае мы используем GTT в качестве материализации того сложного запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:47 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, А эта GTT создается одна на всех пользюков, или для каждого своя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 12:54 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев, Одна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:02 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий СоболевА эта GTT создается одна на всех пользюков, или для каждого своя?Метаданные одни на всех, но данные каждые видит строго свои (своей транзакции или своего коннекта, как настроишь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 13:22 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий СоболевВот и как мне организовать эту сортировку?Ты удивишься, но - с ORDER BY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 14:49 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
hvladАртемий СоболевВот и как мне организовать эту сортировку?Ты удивишься, но - с ORDER BY Спасибо, К.О.! Вот может ко всему подскажете, как организовать сортировку на вложенном for select для всего набора? (по входным данным из первого for select) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:04 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий СоболевВот может ко всему подскажетеЕсли бы в твоём описании можно было хоть что-то понять (меньше чем за полдня и без 100 грамм) - то может и подсказал бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 15:49 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
hvladАртемий СоболевВот может ко всему подскажетеЕсли бы в твоём описании можно было хоть что-то понять (меньше чем за полдня и без 100 грамм) - то может и подсказал бы Прошу прощения за сумбур в описании. в сообщении 17552771 в первом скрипте видны два цикла. Допустим в первом цикле выходят значения 78, 67, 98, 45... во вложенном втором цикле КАЖДОМУ значению соответствует ровно 1 значение, пусть будет например 1, 7, 14, 7 соответственно. мне нужно сделать сортировку (группирование) значений из внешнего цикла по значениям внутреннего цикла. Как видно, 7 встречается 2 раза, соответственно на выходе должно быть три строки 1, 7, 14. Для семерки должны состоятся суммирования. Вот не выходя за пределы одной ХП и не используя вспомогательную ХП каким образом сделать подсчеты, ну или сортировку для подсчетов вручную. В свете GTT получается достаточно приемлемый вариант. Только надо озаботиться очисткой и другими безобразиями перед использованием. Но тогда ещё вопрос: кто и когда должен озаботиться удалением этой таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 16:36 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболевещё вопрос: кто и когда должен озаботиться удалением этой таблицы? Никто и никогда. Почитай уже доку. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 16:44 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий СоболевВ свете GTT получается достаточно приемлемый вариант. Только надо озаботиться очисткой и другими безобразиями перед использованием. Но тогда ещё вопрос: кто и когда должен озаботиться удалением этой таблицы? Ты когда создаешь GTT - указываешь, когда данные в ней должны быть убиты. А дальше сервер сам все сделает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 16:56 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий СоболевТолько надо озаботиться очисткой и другими безобразиями перед использованием.Доку почитай уже. При старте транзации (или коннекта) таблица всегда чистая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2015, 20:57 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Немножко отошли от топика в сторону GTT, но всетаки "with execute block (params)" это будет мощная штука, если будет. Незнаю если у Артемий прямо "Говнодизайн БД detected" но вот бы мне очень помогла такая конструкция, пока нету collateral joins. Вот для топика http://www.sql.ru/forum/1152604/mozhno-li-vypolnit-odnim-zaprosom оптимально не обошелся без доп процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 08:53 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Dorin Marcoci, ты бы хоть название джойна скопировал, а то народ путаешь. Правильное название LATERAL JOIN. LATERAL в трешке нет, но зато есть подпроцедуры Код: 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. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:31 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
ой, дико извиняюсь, помню что что-то по бокам :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:43 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Объясните пожалуйста, что я делаю не так? Создал временную таблицу. Select по rdb$relations её отображает. Но при компиляции ХП ругается, что такой таблицы нет. Даже если эту таблицу надо делать каждый раз при подключении пользователя (хотя в доке вроде об этом ни слова, и нет внятной информации как проверить её наличие), компиляция-то всё-равно не идет. Или предлагается заворачивать в строки и использовать execute statment? Но это тоже не логично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:47 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисDorin Marcoci, LATERAL в трешке нет, но зато есть подпроцедуры так идея была _без_ процедур, нежели с под-процедурами. хотя под-процедуры тоже отличная штука, если места где нужно агрегировать а потом еще чего-то делать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:48 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Dorin Marcoci, для этого есть оконные функции SUM(field) OVER(...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:52 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев выкладывай скрипт как и что создаёшь. Ты походу динамически её решил создать. Так и не почитал документацию. http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird_Language_Reference_RUS.pdf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 09:54 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисАртемий Соболев выкладывай скрипт как и что создаёшь. Ты походу динамически её решил создать. Так и не почитал документацию. http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird_Language_Reference_RUS.pdf Документацию читал, тока ту, что на ангельском. Возможно что-то некорректно перевел. Сейчас изучаю вариант по указанной вами ссылке. По существу ваших негодований могу сказать, что создаю таблицу все-таки не в ХП (об этом очень много писалось как на параллельных ветках, в этой ветке, и других ресурсах сети. Надо быть абсолютным дебилом, чтобы это проигнорировать). Вопрос остается открытым. Создание GTT - при подключении пользователя. А проверка на наличие уже имеющейся таблицы? Или в случае с GTT игнорируется факт уже существующей таблицы? И ещё. Тут часто упоминают третью версию Firebird. Есть ли документация на эту волшебную СУБД? Хочется попробовать, и, возможно со временем, на неё перейти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 10:10 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Сейчас провел небольшой эксперимент: создал GTT. Не отключаясь первым пользователем, подключился вторым пользователем, проверил - он эту таблицу не видит. При попытке создать такую же таблицу ругань в ответ. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 10:18 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий СоболевДокументацию читал, тока ту, что на ангельском. Возможно что-то некорректно перевел. Сейчас изучаю вариант по указанной вами ссылке. По существу ваших негодований могу сказать, что создаю таблицу все-таки не в ХП (об этом очень много писалось как на параллельных ветках, в этой ветке, и других ресурсах сети. Надо быть абсолютным дебилом, чтобы это проигнорировать). Вопрос остается открытым. Создание GTT - при подключении пользователя. А проверка на наличие уже имеющейся таблицы? Или в случае с GTT игнорируется факт уже существующей таблицы? В английской версии написано почти тоже самое что и в русской. Разница лишь в том что пока нет англоязычного варианта который объединил бы весь синтаксис SQL. Есть только LangRef от IB 6 и LangRef Update в котором описаны изменения относительно IB6. По сути вопроса. Не надо создавать GTT каждый раз при подключении. Надо создать её 1 раз (вообще) и потом использовать как и любую другую таблицу. Артемий СоболевИ ещё. Тут часто упоминают третью версию Firebird. Есть ли документация на эту волшебную СУБД? Хочется попробовать, и, возможно со временем, на неё перейти. Есть ReleaseNotes . Есть так же документация и на русском аналог того что сделано на 2.5. Но поскольку LangRef Update для трешки ещё нет, да и сама она находится в Beta статусе, то эта дока не совсем полная. Возможно множество ошибок и т.д. Впрочем я могу выложить на неё ссылку, если kdv с Ковязиным не будут возражать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 10:23 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисЕсть ReleaseNotes . Этого на данном этапе достаточно, спасибо. Просто иметь представление об этой СУБД. Один раз создать и потом пользоваться GTT пока не получается. Создаю GTT из под SYSDBA, отключаюсь, подключаюсь снова и этой таблицы нет. И как писал выше, если не отключаюсь одним ползователем, создавшим эту таблицу и подключаюсь другим, то второй не видит её. И создать не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 10:28 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий СоболевОдин раз создать и потом пользоваться GTT пока не получается. Создаю GTT из под SYSDBA, отключаюсь, подключаюсь снова и этой таблицы нет. И как писал выше, если не отключаюсь одним ползователем, создавшим эту таблицу и подключаюсь другим, то второй не видит её. И создать не может.ВСЕ (в том числе ГТТ) метаданные надо создавать монопольно, после коммита и дисконнекта этого коннекта можно поднимать коннекты работающие с данными, тогда все будет работать ГАРАНТИРОВАННО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 10:37 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Артемий Соболев, не ври. Commit делаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 10:38 |
|
||
|
with execute block
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисАртемий Соболев, не ври. Commit делаешь? Вот жеж! Всё-таки устал, надо в отпуск. Спасибо всем, принявшим участие в этой ветке. Стыд и позор на мою голову, что не догадался о таком элементарном действе. Теперь всё как заявлено. Отдельное спасибо Денису, за терпение и упорность тыканья меня носом в... а так-же за ссылку на полезный документ. Даже два. У всех прошу прощения за отнятое у вас время. Мне реально стыдно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2015, 10:45 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1562885]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 10ms |
| total: | 171ms |

| 0 / 0 |
