Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Update set case / 10 сообщений из 10, страница 1 из 1
23.04.2020, 12:02
    #39950369
cadavinci
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
Подскажите пожалуйста правильный синтаксис!

Хочу сделать update поля pole1.

declare
begin
for rec in (select * from table1)
loop
update table2 set pole1
case
when rec.pole2=10 and id=rec.id then 1
else
when rec.pole2=20 and id=rec.id then 2
else
when rec.pole2=30 and id=rec.id then 3
end;
end loop;
end;
...
Рейтинг: 0 / 0
23.04.2020, 12:10
    #39950371
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
cadavinci
Подскажите пожалуйста правильный синтаксис!
sql reference
...
Рейтинг: 0 / 0
23.04.2020, 12:16
    #39950375
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
если исправлять именно ваш pl/sql блок:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
begin
for rec in (select * from table1)
loop
 update table2 t2 
 set t2.pole1
             case
             when rec.pole2=10 then 1
             when rec.pole2=20 then 2
             when rec.pole2=30 then 3
             end
   where id=rec.id;
end loop;
end;

[/quote]
а вообще pl/sql тут не нужен. По мантре Тома Кайта: если можно сделать одним SQL, то делаем имеено в SQL:
Код: plsql
1.
2.
3.
4.
5.
merge into table2
using table1
on (table1.id = table2.id)
when matched then update
set table2.pole1 = decode(table1.pole2,10,1,20,2,30,3);



и пользуйтесь кнопочкой SRC, пожалуйста
...
Рейтинг: 0 / 0
23.04.2020, 12:22
    #39950379
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
cadavinci
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
begin
for rec in (select * from table1)
loop
update table2 set pole1
case
when rec.pole2=10 and id=rec.id then 1
else
when rec.pole2=20 and id=rec.id then 2
else
when rec.pole2=30 and id=rec.id then 3
end;
end loop;
end;



Database SQL Language Reference UPDATE


Там в конце есть примеры, и да, PL/SQL Вам для приведенного примера не нужен.

p.s.

Студентам, желающим помощи
HOWTO :: Как правильно задавать вопросы
Как мне оформить свое сообщение?

Если хотите, чтобы Вам помогли, задайте вопрос правильно:

1) Полная постановка задачи (без сокращений)
2) Подготовьте тестовые данные, лучше в виде with
например (не ваш случай):

Код: plsql
1.
2.
3.
4.
5.
6.
with tbl(col1,col2,col3) as (
select 1,'name1',to_date('11.02.1921','DD.MM.YYYY') from dual union all
select 2,'name2',to_date('11.02.1922','DD.MM.YYYY') from dual union all
select 2,'name2',to_date('11.02.1922','DD.MM.YYYY') from dual
)
select col2 from tbl...



2) Покажите что сделали, и что получили (не в пересказе)


3) Старайтесь не использовать screenshot, научитесь копировать и оформлять текст


В этом случае Вам обязательно помогут
Код: plsql
1.
2.
3.
4.
5.
6.
with tbl(col1,col2,col3) as (
select 1,'name1',to_date('11.02.1921','DD.MM.YYYY') from dual union all
select 2,'name2',to_date('11.02.1922','DD.MM.YYYY') from dual union all
select 2,'name2',to_date('11.02.1922','DD.MM.YYYY') from dual
)
select col2 from tbl...



2) Покажите что сделали, и что получили (не в пересказе)


3) Старайтесь не использовать screenshot, научитесь копировать и оформлять текст


В этом случае Вам обязательно помогут
...
Рейтинг: 0 / 0
23.04.2020, 12:32
    #39950390
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
xtender
делаем имеено в SQL:


Offtop: Кстати, багу с write consistency в merge уже поправили, не в курсе?

Ontop: Так тоже можно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table table1(id primary key,pole1) as select rownum, rownum*10 from dual connect by level <10;
create table table2(id,pole1) as select rownum-1, -1 from dual connect by level <7;

update(
select t1.id, t1.pole1 t1_pole1, t2.pole1 t2_pole1
  from table1 t1, table2 t2 where t1.id = t2.id
) set t2_pole1=case t1_pole1 when 10 then 1 when 20 then 2 when 30 then 3 end
;
select * from table2;
...
Рейтинг: 0 / 0
13.05.2020, 19:03
    #39957077
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
andrey_anonymous
xtender
делаем имеено в SQL:

Offtop: Кстати, багу с write consistency в merge уже поправили, не в курсе?

Не поправили однако.
Ужо 14 лет как non-published Bug 5214824
Оракл такой оракл... :)
...
Рейтинг: 0 / 0
16.05.2020, 20:40
    #39958433
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
andrey_anonymous
andrey_anonymous
пропущено...

Offtop: Кстати, багу с write consistency в merge уже поправили, не в курсе?

Не поправили однако.
Ужо 14 лет как non-published Bug 5214824
Оракл такой оракл... :)
И какой там предлагается workaround?

Если что, добавление "delete where <заведомо ложное условие>" решит проблему с согласованностью - lock row
...
Рейтинг: 0 / 0
17.05.2020, 14:02
    #39958585
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
Кобанчег
решит проблему с согласованностью

эээ... Продемонстрируете?
...
Рейтинг: 0 / 0
17.05.2020, 14:17
    #39958594
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
andrey_anonymous
Кобанчег
решит проблему с согласованностью

эээ... Продемонстрируете?

testcase 14-летней давности
...
Рейтинг: 0 / 0
17.05.2020, 16:01
    #39958620
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update set case
andrey_anonymous,

Для полноты картины в оригинал внесены минимальные изменения (выделены красным).
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> merge into ane_test
  2  using (select 2 n from dual union all select 7 n from dual union all select 8 n from dual union select 1 from dual) t2
  3  on (ane_test.m=t2.n)
  4  when matched then update set ane_test.n=(-1)*ane_test.n
  5  when not matched then insert values(t2.n,0);

4 rows merged.

SQL> select * from ane_test;

         M          N
---------- ----------
         1        -11
        14        -12
         3         13
         4         14
         5         15
         6         16
        24        -17
        26        -18
         9         19

9 rows selected.


В delete должен фигурировать столбец из кляузы on.
Код: 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.
SQL> merge into ane_test
  2  using (select 2 n from dual union all select 7 n from dual union all select 8 n from dual union select 1 from dual) t2
  3  on (ane_test.m=t2.n)
  4  when matched then update set ane_test.n=(-1)*ane_test.n
  5  delete where m = 0
  6  when not matched then insert values(t2.n,0);

4 rows merged.

SQL> select * from ane_test;

         M          N
---------- ----------
         1        -11
        14         12
         3         13
         4         14
         5         15
         6         16
        24         17
        26         18
         9         19
         7          0
         2          0
         8          0

12 rows selected.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Update set case / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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