Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Двойной update, bug? / 25 сообщений из 61, страница 1 из 3
28.02.2014, 16:16:07
    #38575453
rashid.abzalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
DDL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table t(
  id bigint primary key, 
  f1 varchar(100), 
  f2 varchar(100)
);

create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  update t 
     set f2 = 'value updated by function' 
   where id = :id;
  Result = 'value from function';
  suspend;
end;

insert into t(id, f1, f2) values (1, 'old f1', 'old f2');


Двойной update:
Код: sql
1.
2.
3.
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;


Запрос:
Код: sql
1.
select f1, f2 from t;


Результат:
idf1f21value from functionold f2

Как же так?
...
Рейтинг: 0 / 0
28.02.2014, 16:18:33
    #38575456
rashid.abzalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
Забыл указать: Server Version: WI-V2.5.2.26540 Firebird 2.5
...
Рейтинг: 0 / 0
28.02.2014, 16:20:48
    #38575460
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
rashid.abzalovКак же так?А как ты хотел ?
...
Рейтинг: 0 / 0
28.02.2014, 16:23:36
    #38575465
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
rashid.abzalov,

а вот нефиг в селективных процедурах update делать, если это конечно не GTT
...
Рейтинг: 0 / 0
28.02.2014, 16:25:53
    #38575469
rashid.abzalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
hvlad,

idf1f21value from function value updated by function

Чтобы сохранились результаты 2-х последовательных update независимых полей.
...
Рейтинг: 0 / 0
28.02.2014, 16:32:43
    #38575483
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
rashid.abzalovЧтобы сохранились результаты 2-х последовательных updateА где тут два последовательных update ?

Далее - запись или обновляется вся, или не обновляется (тоже вся). Нет никаких "update независимых полей".

PS Последовательные операции - это такие операции, у которых не пересекаются моменты начала и окончания.
...
Рейтинг: 0 / 0
28.02.2014, 16:34:46
    #38575485
rashid.abzalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
Симонов Денис,
автора вот нефиг в селективных процедурах update делать, если это конечно не GTT
Нет, не GTT и транзакция пишущая.

А почему нельзя? Например процедура, что-то изменила и сообщила об этом.
...
Рейтинг: 0 / 0
28.02.2014, 16:42:45
    #38575494
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
rashid.abzalovНапример процедура, что-то изменила и сообщила об этом.

Для этого процедуру не обязательно делать селективной. Ты ещё не на такие баги напорешься если будешь так делать. В курсе про не стабильность курсора?

Если хочешь в каком-то поле зафиксировать тот факт что таблица была изменена это можно сделать с помощью триггеров.
...
Рейтинг: 0 / 0
28.02.2014, 16:43:22
    #38575496
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
[quot hvlad]rashid.abzalovА где тут два последовательных update ?

да хоть бы и непоследовательных. типа update (в процедуре) прошел, ошибок никто не получил, а результата-то его -ап!, и нету.

"Нехорошо, Шурик" (с).
...
Рейтинг: 0 / 0
28.02.2014, 16:46:31
    #38575499
rashid.abzalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
hvlad,
авторА где тут два последовательных update ?
Ну, хорошо, не последовательных, а вложенных.

авторДалее - запись или обновляется вся, или не обновляется (тоже вся). Нет никаких "update независимых полей".
То, что сейчас это работает так, это понятно? Но правильно ли это?
...
Рейтинг: 0 / 0
28.02.2014, 17:52:13
    #38575577
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
rashid.abzalovТо, что сейчас это работает так, это понятно? Но правильно ли это?Я с радостью приму ссылку на стандарт, где описано это поведение.
Сам искать не буду - нет ни времени, ни желания.

Функции с побочными эффектами - это бардак. В любом ЯП.
Обычно в первый год обучения (практического, а не теоритического) это проходит :)
...
Рейтинг: 0 / 0
28.02.2014, 17:53:02
    #38575579
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
pizmon,

не надо меня провоцировать
...
Рейтинг: 0 / 0
28.02.2014, 17:55:25
    #38575582
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
hvladpizmon,

не надо меня провоцировать

Я пошутил, не обижайся.

по сути - все понятно, спасибо.
...
Рейтинг: 0 / 0
28.02.2014, 18:48:45
    #38575627
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
pizmon,

для закрепления материала советую подумать над результатом немного модифицированной процедуры

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  delete from t  
  where id = :id;
  Result = 'value from function';
  suspend;
end;



Код: sql
1.
2.
3.
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;
...
Рейтинг: 0 / 0
28.02.2014, 19:14:58
    #38575641
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
Симонов Денисpizmon,

для закрепления материала советую подумать над результатом немного модифицированной процедуры

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  delete from t  
  where id = :id;
  Result = 'value from function';
  suspend;
end;



Код: sql
1.
2.
3.
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;



Тебя-то можно провоцировать? Не сбежишь?

Тогда есть три варианта - delete в процедуре удаляет одну запись, update - no rows affected.
Второй вариант - exception при update (во внешнем контуре).
Третий вариант - exception в процедуре, типа попытки удалить залоченную запись.

Теперь ты о чем-нибудь подумай.
...
Рейтинг: 0 / 0
28.02.2014, 23:34:21
    #38575766
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
pizmon,

даже думать не собираюсь. Просто привёл абсурдность таких действий
...
Рейтинг: 0 / 0
28.02.2014, 23:47:14
    #38575770
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
pizmon,

не угадал результьтат
null null null
...
Рейтинг: 0 / 0
28.02.2014, 23:51:03
    #38575773
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
Симонов Денис,

это для Fb3

для Fb2.5

The cursor identified in the UPDATE or DELETE statement is not positioned on a row.
no current record for fetch operation.
...
Рейтинг: 0 / 0
01.03.2014, 01:31:35
    #38575855
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
Симонов ДенисСимонов Денис,

для Fb2.5

The cursor identified in the UPDATE or DELETE statement is not positioned on a row.
no current record for fetch operation.

Таки шо мэшаеть сделать то же самое для конфликта update-update? Или хотя бы признать проблему?
Модератор: Давайте не будем заниматься наездами?
...
Рейтинг: 0 / 0
01.03.2014, 02:40:39
    #38575886
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
Модератор: удалено
...
Рейтинг: 0 / 0
01.03.2014, 08:54:12
    #38575913
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
rashid.abzalovА почему нельзя?Если не сделать fetch all резалтсета, то результаты могут быть самыми неожиданными.
Изменения в таблице лучше фиксировать триггерами.
...
Рейтинг: 0 / 0
01.03.2014, 11:02:08
    #38575932
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
Чорт, всё проспал! Надеюсь, под модераториалом скрывается та самая ссылка на стандарт, а не выступление по национальному вопросу.

Давайте, шановни друзи, вернемся к исходному вопросу.
Про триггера я действительно чуть было не забыл. А они говорят, что updatы таки действительно последовательные, зря мы эту позицию так легко сдали.

Можно слегонца модифицировать исходный DML:

Код: sql
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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
create generator newid;

create table t(
  id bigint primary key, 
  f1 varchar(100), 
  f2 varchar(100) 
);

create table tr(
  id bigint,
  log varchar(100)
);

SET TERM ^ ;

CREATE TRIGGER tbu FOR T
ACTIVE BEFORE UPDATE POSITION 0
AS 
BEGIN 
  insert into tr(id, log) values (gen_id(newid, 1), 'before update: ' || new.f2 );  
END^

CREATE TRIGGER tau FOR T
ACTIVE after UPDATE POSITION 0
AS 
BEGIN 
  insert into tr(id, log) values (gen_id(newid, 1), 'after update: ' || new.f2 );  
END^


create procedure p (
  id bigint) 
returns (
  Result varchar(100)
)
as
begin
  update t 
     set f2 = 'value updated by function' 
   where id = :id;
   
 insert into tr(id, log) 
  select gen_id(newid, 1), 'after statement: ' || f2
   from t where id = :id; 

  Result = 'value from function';
  suspend;
end^


SET TERM ;^ 
commit;
insert into t(id, f1, f2) values (1, 'old f1', 'old f2');
update t 
   set f1 = (select Result from p(1)) 
 where id = 1;
select * from tr order by id;



И получить
Код: sql
1.
2.
3.
4.
5.
 1 before update: value updated by function
 2 after update: value updated by function
 3 after statement: value updated by function
 4 before update: old f2
 5 after update: old f2



Намек на то, что пока первый апдейт не закончился, второй - не начинается.
...
Рейтинг: 0 / 0
01.03.2014, 11:12:08
    #38575938
pizmon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
hvladФункции с побочными эффектами - это бардак. В любом ЯП.

Всё есть яд, дружище, и всё есть лекарство - однако же в зависимости от дозы.
Мне вот кажется, что "прогоченный" оператор - это больший бардак, чем весь side-effect в мире, вместе взятый. Так что провоцировать надо, иначе не достучаться.

Мир?
...
Рейтинг: 0 / 0
01.03.2014, 13:21:38
    #38575974
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
pizmon,

если тебе что-то кажется, а тебе говорят, что это не так, то это есть повод или самому разобраться - почему тебе так говорят, или спросить - а как же там оно на самом деле, или тупо троллить оппонента.
Ты пошёл последним путём - твой выбор.
...
Рейтинг: 0 / 0
01.03.2014, 13:22:57
    #38575975
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Двойной update, bug?
2модератор - не перегибай с удалениями, ибо будет нечего удалять вскоре.

2all - я всего лишь спросил, не пошутил ли pizmon опять...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Двойной update, bug? / 25 сообщений из 61, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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