| Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
| Все форумы / Oracle |
![]() |
||
|
BigNik Member Откуда: Сообщений: 219 |
Прошу помочь в ситуации,планируем переехать на 11.2.0.3 и притестирование приложений заметили следующий баг. искал на металинке и инете но не нашел ничего стоящего Имеем таблицы (создал тестовые для упрощения) Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production PL/SQL Release 11.2.0.3.0 - Production CORE 11.2.0.3.0 Production TNS for Linux: Version 11.2.0.3.0 - Production NLSRTL Version 11.2.0.3.0 - Production create table SP_TOV_test ( nomk_ls NUMBER(13) not null, c_trn VARCHAR2(13) ); insert into SP_TOV_test values(0,100); insert into SP_TOV_test values(0,100); insert into SP_TOV_test values(0,100); create table L_RECEPT_test ( id number , c_ls NUMBER(15) ); insert into L_RECEPT_test values(1,100); insert into L_RECEPT_test values(2,100); insert into L_RECEPT_test values(1,100); insert into L_RECEPT_test values(1,100); и выполним запрос select a.rowid ri,a.* from L_RECEPT_test a where a.id=1 AND a.C_LS IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SP_TOV_test WHERE (C_TRN = a.C_LS ) or (nomk_ls = a.C_LS ) ) получаем ошибку ora-1790 меняем местами условие a.C_LS = nomk_ls select a.rowid ri,a.* from L_RECEPT_test a where a.id=1 AND a.C_LS IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SP_TOV_test WHERE (C_TRN = a.C_LS ) or (a.C_LS = nomk_ls ) ) обрабатывает нормально ставим and вместо or select a.rowid ri,a.* from L_RECEPT_test a where a.id=1 AND a.C_LS IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SP_TOV_test WHERE (C_TRN = a.C_LS ) and (nomk_ls = a.C_LS ) ) тоже все нормально комментируем любое из условий и запрос успешен. Обращаю внимание такое только в 11.2.0.3 в 11.2.0.2 и 10.2.0.4 все вариации обрабатываются без ошибок версия оракла 11.2.0.3 в раке из двух узлов версия оракла 10.2.0.4 в раке из двух узлов тоже и извечный вопрос что делать то? |
| 6 июн 12, 13:17 [12674023] Ответить | Цитировать Сообщить модератору | |
|
---*---
Guest |
BigNik, >Что делать то? А что надо-то? (C_TRN = a.C_LS or nomk_ls = a.C_LS ) или a.C_LS in (C_TRN,nomk_ls) - норм? |
| 6 июн 12, 13:33 [12674172] Ответить | Цитировать Сообщить модератору | |
|
orawish Member Откуда: Гадюкино-2 (City) Сообщений: 13091 |
продолжать искать затычку (у вендора). если не найдёте - SR создавайте. ну а чтобы не ждать - переписывайте тот OR - например, через decode / case / регулярное выражение / .. и т.п. , да на крайняк - и через union вообще, частенько оптимизатор с тем OR косячит. затыкают, затыкают - всё заткнуть не могут. так что работа по уходу от него = повышение стойкости кода к последующим (в том числе еще и не изготовленным ) глюкам |
||
| 6 июн 12, 13:37 [12674203] Ответить | Цитировать Сообщить модератору | |||
|
Timur Akhmadeev Member Откуда: Сообщений: 457 |
Использовать явное приведение типов. Беда каая-то с транформацией запроса. |
||
| 6 июн 12, 13:41 [12674240] Ответить | Цитировать Сообщить модератору | |||
|
kinky cat Member Откуда: с дивана23 Сообщений: 997 |
BigNik, для начало надо запрос нормально написать - где используются алиасы, где нет за такую писанину надо по рукам бить |
| 6 июн 12, 13:42 [12674259] Ответить | Цитировать Сообщить модератору | |
|
BigNik Member Откуда: Сообщений: 219 |
оба запроса с этой же ошибкой ошибка на обоих узлах. select a.rowid ri,a.* from L_RECEPT_test a where a.id=1 AND a.C_LS IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SP_TOV_test WHERE (C_TRN = a.C_LS or nomk_ls = a.C_LS ) ) select a.rowid ri,a.* from L_RECEPT_test a where a.id=1 AND a.C_LS IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SP_TOV_test WHERE a.C_LS in (C_TRN,nomk_ls) ) что касаемо запроса,писали программисты,а я вроде как админ. и пишут и в прям криво плюс не оптимально и не используют связываемые переменные, устал бороться с этим с ними обращаюсь к тем у кого версия 11.2.0.3 . происходит ли ошибка при моих вводных? |
||
| 6 июн 12, 14:04 [12674462] Ответить | Цитировать Сообщить модератору | |||
|
---*---
Guest |
BigNik, Да, проверил на 11.0.3.0, та же фигня. С to_number(C_TRN) работает |
| 6 июн 12, 14:18 [12674629] Ответить | Цитировать Сообщить модератору | |
|
BigNik Member Откуда: Сообщений: 219 |
спасибо, будем думать, сейчас интересует стоит ли ставить PSU 11.2.0.3.2 решит ли проблему? по списку под правленых багов вроде невидно, может у кого нибудь стоит данный PSU и сможет проверить запрос |
||
| 7 июн 12, 05:00 [12679041] Ответить | Цитировать Сообщить модератору | |||
|
Timur Akhmadeev Member Откуда: Сообщений: 457 |
тынц
Не решит. |
||
| 7 июн 12, 13:42 [12681750] Ответить | Цитировать Сообщить модератору | |||
|
BigNik Member Откуда: Сообщений: 219 |
Timur Akhmadeev, спасибо |
| 8 июн 12, 06:23 [12684947] Ответить | Цитировать Сообщить модератору | |
|
BigNik Member Откуда: Сообщений: 219 |
если столкнулись с такой ошибкой и лень переписывать запрос, меняя порядок или явно преобразовывая, есть простое решение, а именно добавить хинт /*+ NO_QUERY_TRANSFORMATION*/ select /*+ NO_QUERY_TRANSFORMATION*/ a.rowid ri,a.* from L_RECEPT_test1 a where a.id=1 AND a.C_LS IS NOT NULL AND NOT EXISTS (SELECT 1 FROM SP_TOV_test1 WHERE (C_TRN = a.C_LS ) or (nomk_ls =a.C_LS) ) может пригодится кому нибудь |
| 31 июл 12, 13:06 [12940077] Ответить | Цитировать Сообщить модератору | |
| Все форумы / Oracle | ![]() |
|