powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01427 как проанализировать программно?
24 сообщений из 24, страница 1 из 1
ORA-01427 как проанализировать программно?
    #40035004
mod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть огромный запрос в курсора в нём полно подзапросов. Вроде все имеют rownum = 1. Визуальнг поймать не могу - слишком большой запрос с подзапросами в подзапросах. Однако возникает ошибка ORA-01427:подзапрос одиночной строки возвращает более одной строки. Проблема ещё в том, что надо найти запись, на которой возникает ошибка. Мало исправить сам запрос - запись вероятно, не корректна в базе.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035010
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mod
Добрый день!

Да такой себе день.

mod
Мало исправить сам запрос - запись вероятно, не корректна в базе.

Можно только посочувствовать. Распиливайте мегазапрос на куски, разворачивайте, всё что можно развернуть и ищите, какая сволочь возвращает больше одной строки.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035019
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mod,

не выход, но

я последовательно ставил min/max пока не пропадет ошибка
накладно но ...

stax
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035032
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mod,

Разбивать запрос на куски и постепенно собирать их обратно. Возможно проблема возникает не на выборке в подзапросах как таковой, а, например, возникает перемножение на соединении отдельных кусков.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035066
mod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не распилить толком - много вложений. Первая мысль понятно что была эта. MiN, MAX rownum = 1 в подзапросах есть. Где нет - равенство по первыичному ключу и дублей быть не может из-за ограничений ключа. Вот думал что может у кого есть идеи как ещё. Запрос реально многостраничный (в смысле текста) и я в нём не вижу визуально где может быть проблема с подзапросом. Раз других идей нет, то ладно.
.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035068
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mod,

еще как вариат
если есть union all (напр текущая табл и архив) по смыслу запись одна или там или там, но мож что-то слетело и сущность в двох ипостасях оказалась

....
stax
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035079
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mod,

если отчетик за период, менять диапазон

напр есть группировка по годам, период с 2020 по 2021, вот и две записи

идей много, но куры ...

....
stax
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035092
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
mod,

какая версия оракла? дело в том, что с какой-то из последних версий (я уже не помню с какой именно) оптимизатор стал разворачивать латералы с rownum:
http://orasql.org/2019/02/16/lateral-view-decorrelationvw_dcl-causes-wrong-results-with-rownum/
http://orasql.org/2019/02/16/another-bug-with-lateral/
В таких случаях, надо запрещать lateral view decorrelation(DCL, хинт NO_DECORRELATE)
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035098
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Как я понял mod использует подзапросы в select list с которыми он по его мнению "успешно" борется добавляя ROWNUM = 1 очевидно не понимая что результат такого запроса не детерминирован и при тех же данных может дать другой результат при последующих выполнениях.

SY.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035104
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
xtender,

Как я понял mod использует подзапросы в select list
SY.


необязательно
напр
where id_ref=(select id from par where par_name='X3' ... )

....
stax
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035138
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

необязательно
напр
where id_ref=(select id from par where par_name='X3' ... )


Суть дела не меняет. Может и

from (select id from par where par_name='X3' and rownum = 1)

Все равно результат такого подзапроса не детерминирован и при тех же данных может дать другой результат при последующих выполнениях.

SY.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035142
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

в общем случае не детерминирован (если нет уникальной сортировки)

но на практике rownum = 1 неприятная страховка, результат детерминирован

и если две строки то что-то разрушено (как у мод) и надо разбиратся

.....
stax
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035145
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по аналогичной причине, когда вижу дистинкт, всегда требую объяснений
потому что всунут такую красоту в скалярный подзапрос, а через полгода прибегают с сабжем
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035150
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx,

вместо дистинкт пусть юзают min/max
реже прибегать будут

.....
stax
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035224
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mod
Вот думал что может у кого есть идеи как ещё.

Сжечь всё в пекле и найти новую работу. Запросы на тысячи строк невозможно нормально сопровождать.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035239
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mod
Вот думал что может у кого есть идеи как ещё.

Сжечь всё в пекле и найти новую работу. Запросы на тысячи строк невозможно нормально сопровождать.
программы на три строчки не всегда эффективны
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035261
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,

Если они генерятся по якорной модели, то других вариантов особо и не будет.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035296
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
программы на три строчки не всегда эффективны

Зато лаконичны и понятны.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035339
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
andreymx
программы на три строчки не всегда эффективны

Зато лаконичны и понятны.
одна программа на 1000 строк часто проще, чем триста по три строки
А три строки это только алгоритм, не считая вызовов и обработки ошибок
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035356
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
одна программа на 1000 строк часто проще, чем триста по три строки

Вот в данном случае - не проще и с таким комком невозможно ничего сделать.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035405
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
одна программа на 1000 строк часто проще, чем триста по три строки
А три строки это только алгоритм, не считая вызовов и обработки ошибок
Всё-таки декомпозицию нормальные люди обычно уважают.
Только с декларативным SQL дела обстоят несколько иначе чем с обычными процедурными/функциональными языками.

Порой из запроса на несколько сот строчек можно веделить ключевое ядро (или даже несколько составных частей) и инкапсулировать куда-то, но тогда придется промежуточный результат грузить либо во времянку либо в коллекцию с вытекающими минусами (вероятно SQL Marco может вдохнуть новую жизнь в подобную декомпозицию).

Кроме того, иногда логику из select list/where clause можно было бы потенциально инкупсулировать в UDF, но исторически разработчики боятся переключения контекста хоть оно с 12с уже может быть почти незаметным и на миллионах строк.

Итого в именно SQL допустимы портянки на сотни строк из-за его специфики, но и это может быть улучшено [вендоро-специфичными плюшками].

PS. Отдельная песня insert all - тут бывает только перечислние полей нескольких толстых таблиц занимает сотни строк.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035490
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
году примерно в 2008-м
решили один большой запрос разбить на несколько поменьше
вместо одной большой процедуры получилось 7, каждая из которых была чуть поменьше оригинальной
но стало действительно чуть понятнее
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035588
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня в хозяйстве имеется один большой запрос.
Раз в год-два ошибки данных вызывают 01427.
Поиск методом половинного деления.
пять-семь итераций и причина найдена.
Раньше любил комменты /**/, теперь --. С минусами проще куски выпиливать.
...
Рейтинг: 0 / 0
ORA-01427 как проанализировать программно?
    #40035600
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoр
у меня в хозяйстве имеется один большой запрос.
Раз в год-два ошибки данных вызывают 01427.
Поиск методом половинного деления.
пять-семь итераций и причина найдена.
Раньше любил комменты /**/, теперь --. С минусами проще куски выпиливать.
а на моменте проектирования нельзя все такие моменты учесть?
я всегда сразу задаю постановщикам вопросы в таких случаях
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / ORA-01427 как проанализировать программно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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