Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Трабла с update  [new]
Stiffman
Member

Откуда:
Сообщений: 80
Запрос вида:

UPDATE xxx x
set xxx.поле1 = to_date('01.01.2008')
where xxx.поле1 = to_date('31.12.2002')
and exists 
(подзапрос)

Так вот трабла в следуюшем, если взять просто запрос:

select * from xxx x
where xxx.поле1 = to_date('31.12.2002')
and exists 
(подзапрос)

то возвращается некий набор данных, если выполнить первый запрос, то получаем:
0 roes updated

кто сталкивался, в чем фишка ???
Заранее благодарен!
20 фев 08, 13:42    [5315894]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Sashko81
Member

Откуда: Киев
Сообщений: 103
А че там в подзапросе-то?
20 фев 08, 13:44    [5315926]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Stiffman
Member

Откуда:
Сообщений: 80
UPDATE xxx x
set xxx.поле1 = to_date('01.01.2008')
where xxx.поле1 = to_date('31.12.2002')
and exists 
 (select null from yyy y
  where y.поле1 = условие1
    and y.поле2 = условие2
    and xxx.поле3 = yyy.поле3
 )
20 фев 08, 13:57    [5316082]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
Stiffman
кто сталкивался, в чем фишка ???
Заранее благодарен!


Ну-ка давай пример в SQL*Plus в студию. Тут магов нет.
20 фев 08, 14:08    [5316186]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
ГостЪ
Guest
Stiffman
Запрос вида:

UPDATE xxx x
set xxx.поле1 = to_date('01.01.2008')
where xxx.поле1 = to_date('31.12.2002')
and exists 
(подзапрос)

Так вот трабла в следуюшем, если взять просто запрос:

select * from xxx x
where xxx.поле1 = to_date('31.12.2002')
and exists 
(подзапрос)

то возвращается некий набор данных, если выполнить первый запрос, то получаем:
0 roes updated

кто сталкивался, в чем фишка ???


Скорее всего в твоей невнимательности. Запросы по твоим схемам вообще не могут работать.
20 фев 08, 14:10    [5316201]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
UDW
Member

Откуда: Самара
Сообщений: 1096
Что-то подобное здесь уже обсуждалось.
Мое мнение - оператор EXISTS в команде UPDATE работает не совсем так, как в SELECT.
В доке примеры приводятся с однозначным условием в подзапросе...
20 фев 08, 14:17    [5316267]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116077
Stiffman
UPDATE xxx x
set xxx.поле1 = to_date('01.01.2008')
where xxx.поле1 = to_date('31.12.2002')
and exists 
 (select null from yyy y
  where y.поле1 = условие1
    and y.поле2 = условие2
    and xxx.поле3 = yyy.поле3
 )


Очень бы хотелось увидеть сессию sqlplus с последовательным выполнением
select и update. Что то мне подсказывает, что при попытке подготовить его,
искомого таинственного эффекта будет нелегко добиться :-)
20 фев 08, 14:20    [5316292]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Elic
Member

Откуда:
Сообщений: 29976
Stiffman
to_date('31.12.2002')
Никогда не следует полагаться на (неявное) nls-зависимое преобразование строка<->дата.
20 фев 08, 14:20    [5316295]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Sashko81
Member

Откуда: Киев
Сообщений: 103
Stiffman
UPDATE xxx x
set xxx.поле1 = to_date('01.01.2008')
where xxx.поле1 = to_date('31.12.2002')
and exists 
 (select null from yyy y
  where y.поле1 = условие1
    and y.поле2 = условие2
    and xxx.поле3 = yyy.поле3
 )

Если используешь алиасы в запросе, то по-людски их используй.
Что-то типа
UPDATE xxx x
set x.поле1 = to_date('01.01.2008')
where x.поле1 = to_date('31.12.2002')
and exists 
 (select null from yyy y
  where y.поле1 = условие1
    and y.поле2 = условие2
    and x.поле3 = y.поле3
 )
20 фев 08, 14:21    [5316310]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
UDW
Мое мнение - оператор EXISTS в команде UPDATE работает не совсем так, как в SELECT.


А как ?
Ты "свое мнение" хоть чем-нибудь подкрепить можешь ? :-?

P.S. У паршивых админов-системщиков была в свое время дурная привычка - каждый
свой ляп объяснять происками вирусов. Не будем уподобляться, OK ?
20 фев 08, 14:22    [5316321]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116077
UDW

Мое мнение - оператор EXISTS в команде UPDATE работает не совсем так, как в SELECT.



Серьезно, очень смешная фраза. Особенно понравилось "не совсем".
Читатель заинтригован
20 фев 08, 14:23    [5316327]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Stiffman
Member

Откуда:
Сообщений: 80
Что самое интересное, у меня update не сработал и по следующей схеме:

update (select x.* from xxx from xxx x, yyy y 
            where y.поле1 = условие1
            and y.поле2 = условие2
            and x.поле3 = y.поле3
            and x.поле1 = to_date('31.12.2002')
        )
set поле1 = to_date('01.01.2008')

Хотя select возвращает набор данных, сейчас эту проблему уже поборол, но
как говорится "почесал левое ухо правой рукой"

Я обновил данные так:

Declare
cursor ccdr is
select x.rowid rx, x.* from xxx x
where xxx.поле1 = to_date('31.12.2002')
and exists 
 (select null from yyy y
  where y.поле1 = условие1
    and y.поле2 = условие2
    and xxx.поле3 = yyy.поле3
 );
begin
   FOR r_cdr IN ccdr
    LOOP  
        update xxx 
        set xxx.поле1 = to_date('01.01.2008')
        where rowid = r_cdr.rx;
        commit;
    END LOOP;
end;


Но с обычным запросом получилось не понятно :(
20 фев 08, 14:31    [5316399]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
UDW
Member

Откуда: Самара
Сообщений: 1096
Сорри за "не совсем" (это чтобы подразнить)
An EXISTS condition tests for existence of rows in a subquery.
А у автора
exists
(select null from yyy y
where y.поле1 = условие1
and y.поле2 = условие2
and xxx.поле3 = yyy.поле3
)

NULL он и в Африке NULL

Это что? Тест на внимание?
20 фев 08, 14:31    [5316401]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
UDW
An EXISTS condition tests for existence of rows in a subquery.
А у автора
exists
(select null from yyy y
where y.поле1 = условие1
and y.поле2 = условие2
and xxx.поле3 = yyy.поле3
)

NULL он и в Африке NULL

Это что? Тест на внимание?
Это Вы так шутите или Вы серьезно???
20 фев 08, 14:34    [5316431]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116077
UDW
Сорри за "не совсем" (это чтобы подразнить)
An EXISTS condition tests for existence of rows in a subquery.
А у автора
exists
(select null from yyy y
where y.поле1 = условие1
and y.поле2 = условие2
and xxx.поле3 = yyy.поле3
)

NULL он и в Африке NULL

Это что? Тест на внимание?


UDW, почитайте внимательнее про EXISTS.
NULL не несет здесь функциональной нагрузки.
Нам все равно , что селектировать в EXISTS- подзапросе ...
20 фев 08, 14:35    [5316453]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Madness
Member

Откуда: Москва
Сообщений: 648
UDW
NULL он и в Африке NULL

NULL и EXISTS здесь вообще никак не коррелируют
20 фев 08, 14:37    [5316467]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
Stiffman
Что самое интересное, у меня update не сработал и по следующей схеме:

update (select x.* from xxx from xxx x, yyy y 
            where y.поле1 = условие1
            and y.поле2 = условие2
            and x.поле3 = y.поле3
            and x.поле1 = to_date('31.12.2002')
        )
set поле1 = to_date('01.01.2008')


Вот неожиданность-то !
ЭТО говно работать не будет.
Догадайся с трех раз почему.

Stiffman

Хотя select возвращает набор данных, сейчас эту проблему уже поборол, но
как говорится "почесал левое ухо правой рукой"


Боже, дай терпения...
Ты можешь наконец продемонстрировать последовательно результат
выполнения SELECT и UPDATE в одном окне SQL*Plus
, о чем тебя
уже люди здесь просили
?
Или будешь продолжать сопли жевать и нести пургу ?
Если будешь - значит, так тебе нужен ответ.
20 фев 08, 14:49    [5316598]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
UDW
NULL он и в Африке NULL

Это что? Тест на внимание?


Нет. Это твое непонимание разницы понятий "отсутствует" и "неопределено"
20 фев 08, 14:52    [5316616]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Stiffman
Member

Откуда:
Сообщений: 80
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.8.0 - Production

SQL> select count(*) from cdr r
  2  where dcdrdate = to_date('26.02.2008','dd.mm.yyyy')
  3  and exists
  4  (
  5   select 'x' from cda where cd.get_enddate (ncdaagrid, icdaisline, dcdalineend) > to_date('25.02.2008','dd.mm.yyyy')
  6   and substr(cdterms.Get_LoanACC(ncdaagrid),1,3)='455'
  7   and dcdaclosed is null
  8   and ncdaagrid = r.NCDRAGRID
  9  ) ;

 COUNT(*)
---------
     4391

SQL> 

соответственно данные не показываю, пытаемся update сделать

SQL> update cdr r
  2  set DCDRDATE = to_date('27.02.2008','dd.mm.yyyy')
  3  --select count(*) from cdr r
  4  where dcdrdate = to_date('26.02.2008','dd.mm.yyyy')
  5  and exists
  6  (
  7   select 'x' from cda where cd.get_enddate (ncdaagrid, icdaisline, dcdalineend) > to_date('25.02.2008','dd.mm.yyyy')
  8   and substr(cdterms.Get_LoanACC(ncdaagrid),1,3)='455'
  9   and dcdaclosed is null
 10   and ncdaagrid = r.NCDRAGRID
 11  ) ;

0 rows updated.

SQL> 
20 фев 08, 15:02    [5316721]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
ГостЪ
Guest
Планы можно посмотреть?
20 фев 08, 15:32    [5317020]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Stiffman
Member

Откуда:
Сообщений: 80
Можно, см. приаттаченный файл

К сообщению приложен файл. Размер - 0Kb
20 фев 08, 16:14    [5317384]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Stiffman
Member

Откуда:
Сообщений: 80


К сообщению приложен файл. Размер - 0Kb
20 фев 08, 16:19    [5317416]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
А можно планы с предикатами?

И ещё на всякий случай - функции deterministic по своей сути?
20 фев 08, 16:41    [5317609]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Stiffman
Member

Откуда:
Сообщений: 80
Jannny
А можно планы с предикатами?

И ещё на всякий случай - функции deterministic по своей сути?


Вот тут не силен, поясните плз. что имеется ввиду ?
20 фев 08, 16:45    [5317634]     Ответить | Цитировать Сообщить модератору
 Re: Трабла с update  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Stiffman
Jannny
А можно планы с предикатами?

И ещё на всякий случай - функции deterministic по своей сути?
Вот тут не силен, поясните плз. что имеется ввиду ?
Если про план, то приведите его через sqlpus : explain plan for и т.д.
Если по поводу второго, то я просто уточняю, всегда ли используемые функции возвращают один и тот же результат на одинаковых данных?
20 фев 08, 17:00    [5317741]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить