|
|
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
В ХП идет подготовка данных для отчета. В одном из запросов выполняется SELECT по нескольким таблицам, в том числе и временной. В нем же стоит большой GROUP BY, и результат сортируется через ORDER BY. Результат запроса заливается во временную таблицу. Прикол в том, что если этот запрос выполнить без INSERT'а, все работает замечательно. Если же выполнить INSERT во временную таблицу, и выбрать данные из этой временной таблицы, то сортировка данных перепутывается, т.е. идет примерно так: 200 200 200 211 - фигня и лажа 200 200 211 211 211 Проблема в том, чтопо этой таблице потом еще курсором бегать надо, и порядок записей очень важен. Но даже если поставить ORDER BY в курсоре, результат не меняется. Что это такое может быть? Таблицы проверены VALIDATE'ом, все вроде нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 13:35 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Версия какая ? Я натолкнулся на это в 8, в 7 такого небыло. Пришлось сортировать и после курсора, а в курсор заганять типа number(), но потанцевать с бубнами придется, особенно если на порядок следования записей опирается логика. Попробуй сделать через FOR UPDATE курсоры. Удачи ! PS: Кто знает, как с этим в 9, я еще туда не дошел... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 13:48 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
ACA 5.5 Долго прыгал с бубном и махал кроличьей лапкой. Помогло, правда, пришлось убрать из insert order by и пихнуть его в курсор. Странно, но если сортировать не по числовому полю (которое мне нужно), а по строке (которая нафиг не нужна), которая описывает смысловую нагрузку этого числового поля, то все работает и на insert'е. Да и вообще, всегда и везде это работало, ни разу не сталкивался с этой проблемой. Огорчил ты меня тем, что в 8-ке это тоже присутствует. Так бы я подумал, что это баг, пофиксенный в более старших версиях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 14:14 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Во временной таблице нужно делать IDENTITY поле, вставлять туда записи, а потом уже делать запросы или курсоры с ORDER BY на это поле. Раньше с старых версиях ASA можно было ожидать поведение, что записи возвращаются так, как они вставленны в таблицу. Однако хочу заметить, что это поведение нигде не документированно и соотвествующе не гарантированно, что это 100% сделается. Начиная с кластерных индексов в 8-ой версии следует помнить только одно, что SELECT без ORDER BY может вернуть записи абсолютно в любом порядке и руководствоваться в построении логики исходя только из этого правила (причем это применимо и к любой конкурирующей СУБД). В 8-ке лучше всего все делать через времянки, так как в подзапросах не разрешается использовать функцию NUMBER и сортировку. В 9-ой версии полегче, так как в ней уже разрешена возможность использования сортировки внутри подзапросов (однако ограничение NUMBER не снято) и есть возможность быстро организовывать временные таблицы через конструкцию SELECT INTO <Table>. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 14:22 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Хорошо. Я могу еще согласиться с тем, что при insert с order by нельзя надеяться на то, что записи будут вставлены в нужном порядке. Но чем тогда объяснить следующее: 1 вариант: order by на insert - не работает 2 вариант: order by на insert и на курсор - не работает 3 вариант: order by ТОЛЬКО на курсор - работает Причем, во всех случаях поле, по которому осуществляется сортировка, существует (никаких NULL!) Все же, на мой взгляд, это больше похоже на баг АСА, чем на ошибку в ДНК :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 14:28 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
автор1 вариант: order by на insert - не работает 2 вариант: order by на insert и на курсор - не работает 3 вариант: order by ТОЛЬКО на курсор - работает Я не очень понимаю что такое order by на insert и order by на insert и курсор. По моему личному опыту ASA 8-9 order by прекрасно на insert работает для кластерных ключей, что однако не мешает ASA уже во время физической вставки все равно перетасовывать записи по разным страницам с более близкими значениями по кластерному ключу с целью наименьшей дефрагментации записей. Так что можно сказать, что если у таблицы нет кластерного ключа, то не факт, что ORDER BY нужен вообще, разве что для обеспечения последовательного чтения в последующих селектах большого кол-ва вставляемых записей и то это зависит от конкретной ситуации. Насчет же курсора Ваш вариант неправилен по определению - нет ORDER BY на курсоры, есть ORDER BY на SELECT, который исполняется и далее по нему открывается курсор. Так что вариант "ORDER BY на INSERT + Курсор" вообще для меня не понятен - причем тут INSERT и курсор, какая между ними взаимосвязь ? Ну а если Вы сначала делаете вставку во времянку через INSERT, а потом на нее делаете курсор через SELECT без указания сортировки, то и получите записи в произвольном порядке, что вполне нормально для любого СУБД. P.S. Так что я пока багов в упор не вижу, вполне возможно что я не понимаю чего то в поставленной проблеме. Дайте Ваш запрос с INSERT, курсором и ORDER BY, тогда легче будет чего то посоветовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 15:11 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Да пожалуйста: Сначала выполняем запрос Код: plaintext 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. 33. 34. 35. 36. Затем открываем курсор, описанный следующим образом: Код: plaintext 1. 2. и по нему ползаем, проводим нужные апдейты, НЕ затрагивая поля, по которым сортировали Так вот, если оставить в таком виде, то не работает сортировка Если оставить order by в описании курсора, то все работает, тащит записи в нужном порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 15:22 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
автор Код: plaintext 1. 2. 3. Гм, не понимаю - то есть вот такая конструкция у Вас приводит к тому, что открываемый курсор не отсортирован по указанным полям ? Если ответ ДА - то это баг и пора качать новый EBF. Если ответ НЕТ, то что тогда не так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 15:55 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Ответ ДА. Но locator сказал, что сталкивался с этим и в АСА8. Да и версия у меня старая, никаких EBF уже не делают. У меня заработало только когда я убрал сортировку после insert (хорошо, чтоб было понятней - убрал в запросе, результаты которого insert'ятся во временную таблицу. Текст запроса см. выше), оставив только в объявлении курсора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 16:01 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Гм, я в 8-9 проблем не наблюдал. Хотя мне сложно судить, у меня в проектах использование курсоров - это еденичные случаи, может поэтому и не натыкался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 16:15 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Я собственно натыкался на данный прикол только в 8 (в 7 все было нормально, в 5 так не делал) 1. Переделывал немного механизм списания добавил поле остаток_после, идея была получить в таблице списания : [документ, тип движения, количество, остаток после, поставка] в поле "остаток после" общий остаток со всех поставок после проведения данной позиции опираясь на время прохождения документа первый прикол был в том, что списывая позицию с нескольких (до 10) поставок 8 делал это так быстро, что и now() получался уникальным, а хотелось четко ловить последнюю запись (и в том числе для получения остатка на дату) - добавил integer, и вроде все стало на свои места ... но при переливе данных надо было его корректно выставить - тут то и поймал этот прикол, помню что с пол-дня только с ним бодался. 2. Когда строил дерево, (хотя и знал уже об возможности подвоха) там нужна была четкая иерархия Я сейчас в состоянии теста по 9 но до 2 п. еще не дошел. Как дойду может и баг выложу. Пока все, удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 19:51 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
Вот читаю я ваши споры и никак не могу понять, а нафиг делать сортировку на сервере??? Начиная с самого первого поста - зачем делать сортировку при вставке во временную таблицу??? При выдаче результата клиенту сортировка нужна (и то только в том случае если клиент сортировать не будет). А какая разница какой порядок записей в таблице при работе с данными? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 22:18 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
2 White Owl: Бывают такие задачки, когда от порядка данных зависит обработка в курсоре. В данном случае, это нужно для того, чтобы сделать сложную сквозную нумерацию результата. По-другому, кроме как через курсор, не сделать. Сама по себе сортировка на insert'е, наверное, не нужна. Но делал этот отчет мой сотрудник, наткнувшись на такую фигню, 6 часов парился, пытаясь обойти эту ошибку. А я отсутствовал, только сегодня увиделись, я пару часов тоже убил на то, чтобы избавиться от этой напасти. Довольно неожиданная штука, учитывая то, что просто select (без вставки) отрабатывает абсолютно нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2004, 23:38 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
mustlive Бывают такие задачки, когда от порядка данных зависит обработка в курсоре. В данном случае, это нужно для того, чтобы сделать сложную сквозную нумерацию результата. По-другому, кроме как через курсор, не сделать. Есть такая вещь, как принцип построения баз данных :) Все современные БД используют принцип "порядок записей в таблице не опеределен". Это аксиома. Завязываться на то что записи в таблице могут быть отсортированы - глупо. Даже на этом форуме несколько месяцев назад я показывал как можно решить задачи типа нумерации записей перед выдачей резалтсета клиенту или расчет какой-либо кумулятивной суммы. Решается это всегда либо через более вдумчивое использование PK или хотя бы через абстрактную нумерацию записей. Единственный случай когда записи в таблице отсортированы это в случае использования кластерных индексов. Но кластерный индекс на таблицу может быть только один, и существуют они далеко не во всех базах. В ASA они появились только с версии 8.0.2. Пойду статью в FAQ сочинять :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2004, 17:51 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
White Owl Есть такая вещь, как принцип построения баз данных :) Все современные БД используют принцип "порядок записей в таблице не опеределен". Это аксиома. Завязываться на то что записи в таблице могут быть отсортированы - глупо. А разве я говорил, что основываюсь на порядке размещения записей в обычной таблице? (лихорадочно просматривает свои предыдущие сообщения). Уффф, вроде не говорил. Речь шла о том, что запрос Код: plaintext 1. 2. Так вот, удивительное рядом, но тот же запрос, результат которого INSERTится в таблицу, вставляет записи в слегка хаотичном порядке. Хотя вроде бы это нелогично: сортируя результат запроса, вы тем самым де-факто должны бы получить записи именно в том порядке, в котором они выводятся в запросе (в соответствии указанному ORDER BY). Но это не происходит. Более того, курсор, который лазит по этой таблице и имеет свое явное указание порядка извлечения записей, тоже лажает этот самый порядок. White Owl Даже на этом форуме несколько месяцев назад я показывал как можно решить задачи типа нумерации записей перед выдачей резалтсета клиенту или расчет какой-либо кумулятивной суммы. Решается это всегда либо через более вдумчивое использование PK или хотя бы через абстрактную нумерацию записей. Я, честно говоря, не помню этого топика. Если можно, дайте ссылку или повторите. Я не очень понимаю, как это можно сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 09:48 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
mustlive Так вот, удивительное рядом, но тот же запрос, результат которого INSERTится в таблицу, вставляет записи в слегка хаотичном порядке. Все верно, селект выдает записи отсортироваными, они вставляются в таблицу. Вопрос: в какое место таблицы будет вставлена запись? Правильный ответ: неизвестно. Проблема не в select..order by, проблема в insert. mustliveЯ, честно говоря, не помню этого топика. Если можно, дайте ссылку или повторите. Я не очень понимаю, как это можно сделать. Ну вот, в FAQ уже положили пару примеров: http://www.sql.ru/faq/faq_topic.aspx?fid=269 http://www.sql.ru/faq/faq_topic.aspx?fid=270 А это то, на основе чего делались те статьи :) /topic/72727 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 17:28 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
White Owl Все верно, селект выдает записи отсортироваными, они вставляются в таблицу. Вопрос: в какое место таблицы будет вставлена запись? Правильный ответ: неизвестно. Проблема не в select..order by, проблема в insert. Ну, если подходить с точки зрения формальной логики - то проще класть записи в том порядке, в котором они поступают из SELECT. Хотя, если разработчики придумали свой способ - это странно, но допустимо. Самое интересное то, что курсор с ORDER BY после этого тоже перестает работать. Вопрос: в каком порядке должен извлекать записи курсор с указанным ORDER BY? Правильный ответ: в том, которое указано в этом условии :) Причем, всегда. Независимо от... White Owl Ну вот, в FAQ уже положили пару примеров: http://www.sql.ru/faq/faq_topic.aspx?fid=269 http://www.sql.ru/faq/faq_topic.aspx?fid=270 А это то, на основе чего делались те статьи :) /topic/72727 Слава Богу, функцию NUMBER(*) я знаю и люблю :) Только, в моем случае, действительно сложная нумерация, ее SELECTом не сделаешь. Общий смысл описывать долго, скажу только, что нумерация с подпунктами (1.1, 1.2, 1.1.2,2.1 и тэпэ) и не очень логичная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 17:45 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
mustlive Ну, если подходить с точки зрения формальной логики - то проще класть записи в том порядке, в котором они поступают из SELECT. Хотя, если разработчики придумали свой способ - это странно, но допустимо. Ничего странного. Запись кладется в первое свободное место. А освободится место может где угодно. Может за полсекунды до вставки очередной записи была удалена запись из другой таблицы? Или просто кеш почистили? :) mustliveСамое интересное то, что курсор с ORDER BY после этого тоже перестает работать. Вопрос: в каком порядке должен извлекать записи курсор с указанным ORDER BY? Правильный ответ: в том, которое указано в этом условии :) Причем, всегда. Независимо от... По идее да, я не пробовал сымитировать эту ситуацию, но если ты можешь ее упростить до десятка команд - публикуй, будем гонять на разных версиях базы. может это даже и глюк самого сервера :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 18:26 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
White Owl По идее да, я не пробовал сымитировать эту ситуацию, но если ты можешь ее упростить до десятка команд - публикуй, будем гонять на разных версиях базы. может это даже и глюк самого сервера :) Честно говоря, это сымитировать сложно. Интерес представляет чисто теоретический. Просто теперь я НИКОГДА В ЖИЗНИ не буду использовать ORDER BY совместно с INSERT. На всякий случай. Чего и вам желаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 18:37 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
авторЧестно говоря, это сымитировать сложно. Интерес представляет чисто теоретический. Просто теперь я НИКОГДА В ЖИЗНИ не буду использовать ORDER BY совместно с INSERT. На всякий случай. Чего и вам желаю. У меня в проекте на ASA9 это стандартная практика, так как это облегчает вставку записей для кластеризованных таблиц. Обратите внимание, что даже для перезагрузки БД ASA по умолчанию рекомендует сортировать записи при выгрузке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 23:25 |
|
||
|
Ошибка при вставке в таблицу (АСА)
|
|||
|---|---|---|---|
|
#18+
ASCRUS У меня в проекте на ASA9 это стандартная практика, так как это облегчает вставку записей для кластеризованных таблиц. Обратите внимание, что даже для перезагрузки БД ASA по умолчанию рекомендует сортировать записи при выгрузке. Не знаю, как с этим делом обстоит в 9-ке, тем более не знаю как работают там кластеризованные таблицы. Сам столкнулся с этим впервые. Даже тестового примера сделать не могу, так как та же процедура с сортировкой по другому полю работает "на ура". Загадка, одним словом. Что касается выгрузки базы - это немного из другой оперы. Данные выгружаются целиком таблицей, никакие связи между таблицами не используются. И выгружаются они не в другую базу или таблицу, а в текстовые файлы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2004, 23:42 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32599873&tid=2014357]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 262ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...