Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Значение поля до update / 25 сообщений из 26, страница 1 из 2
05.12.2017, 15:15
    #39564464
gfhfyjz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
Добрый день!
Делаю update поля, перед commit хотелось бы вытянуть предыдущее значение, которое было изменено, но в select-е.

Есть вариант заполнять временную таблицу,перед update-ом. Но это pl sql, а нужно в select-е.

Суть в том что бы в промежуточном отчете сравнивать новое и старое значение(до update ), и после проверки юзер делает commit или rollback.

Заранее спасибо.
...
Рейтинг: 0 / 0
05.12.2017, 15:19
    #39564468
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzДелаю update поля...
а нужно в select-е...
Ты определился, где хочешь получить значения?
...
Рейтинг: 0 / 0
05.12.2017, 15:22
    #39564473
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjz
Есть вариант заполнять временную таблицу,перед update-ом. Но это pl sql, а нужно в select-е.



в триггере?

ps
сначала сравнить "залоченное", потом изменить

.....
stax
...
Рейтинг: 0 / 0
05.12.2017, 15:23
    #39564475
gfhfyjz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
AlexFF__|,
Да, в селекте.
Но есть вариант в pl sql перед update-ом заполнить временную таблицу.

т.е. Выполняется блок pl sql с update-ом, затем юзер открывает отчет в котором нужно отобразить предыдущее значение. и затем идет коммит или роллбэк.
...
Рейтинг: 0 / 0
05.12.2017, 15:29
    #39564479
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzAlexFF__|,
Да, в селекте.
Но есть вариант в pl sql перед update-ом заполнить временную таблицу.

т.е. Выполняется блок pl sql с update-ом, затем юзер открывает отчет в котором нужно отобразить предыдущее значение. и затем идет коммит или роллбэк.
select for update
сравнений значений в отчете
update+commit or rollback
...
Рейтинг: 0 / 0
05.12.2017, 15:33
    #39564481
gfhfyjz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
Stax,

Триггер не трогаю.
Выполняется обычный блок pl sql.

И если значение "залоченное", как мне достучаться до нового значения которое должно было проставиться update-ом. Мне нужно сравнить новое и старое значение.

например как в триггере
есть :new и :old, вот мне тоже самое но в select-е.

update dual set dummy = 'Y';
select :new.dummy,:old.dummy from dual
...
Рейтинг: 0 / 0
05.12.2017, 15:37
    #39564487
gfhfyjz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
AlexFF__|,

select for update вернет только старое значение, а нужно одновременно и новое и старое.
Приблизительно:
update dual set dummy = 'Y';
select :new.dummy,:old.dummy from dual
...
Рейтинг: 0 / 0
05.12.2017, 15:38
    #39564488
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzAlexFF__|,

select for update вернет только старое значение, а нужно одновременно и новое и старое.
Приблизительно:
update dual set dummy = 'Y';
select :new.dummy,:old.dummy from dual
У тебя нет новых значений? =)
Не нужно обновлять записи просто так.
Решил - тогда обновляй.
...
Рейтинг: 0 / 0
05.12.2017, 15:38
    #39564489
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzстарое значение(до update )
Код: plsql
1.
as of

Но скорее всего, ты выбрал неправильный путь.
...
Рейтинг: 0 / 0
05.12.2017, 15:41
    #39564492
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
update dual set dummy = 'Y' returning :old.dummy
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.12.2017, 15:48
    #39564496
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
Dimitry Sibiryakovupdate dual set dummy = 'Y' returning :old.dummy
А где это выполнять? В instead of триггере для вьюхи поверх dual-а?
...
Рейтинг: 0 / 0
05.12.2017, 15:50
    #39564499
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzзатем юзер открывает отчет в котором нужно отобразить предыдущее значение
commit не делай, оно само отобразится в другой сессии-то
...
Рейтинг: 0 / 0
05.12.2017, 15:53
    #39564502
Значение поля до update
gfhfyjz,

Издревле оптимисты действовали по сценарию:
Код: plsql
1.
2.
3.
select поле from таблица where ключ=кого;
...
update таблица set поле=new_значение where ключ=кого and поле=old_значение /*not null*/;


Более модный вариант, включить rowdependencies и пользовать ora_rowscn.

Для поизвращаться есть совсем альтернативно-одаренные способы.
...
Рейтинг: 0 / 0
05.12.2017, 16:01
    #39564514
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
Dimitry Sibiryakovupdate dual set dummy = 'Y' returning :old.dummy


SQL) /
SP2-0552: Bind variable "OLD" not declared.
SQL)

.....
stax
...
Рейтинг: 0 / 0
05.12.2017, 16:01
    #39564515
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzСуть в том что бы в промежуточном отчете сравнивать новое и старое значение(до update ), и после проверки юзер делает commit или rollback.
А зачем все делать в последний момент...
Нет возможности отобразить старые данные до нажатия на кнопку перед изменением?
...
Рейтинг: 0 / 0
05.12.2017, 16:16
    #39564528
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzStax,

Триггер не трогаю.
Выполняется обычный блок pl sql.

И если значение "залоченное", как мне достучаться до нового значения которое должно было проставиться update-ом. Мне нужно сравнить новое и старое значение.

например как в триггере
есть :new и :old, вот мне тоже самое но в select-е.

update dual set dummy = 'Y';
select :new.dummy,:old.dummy from dual

старое значения не в триггере не знаю как получить

если табличка Ваша, можно в таблице сохранять в доп. полях old_xxx (чуть подгрузит ну и фиг)
update t set old_xxx=xxx, xxx=new_v ....

если система не для полета на Марс с Восточного и допускает вольности
можно прикрутить "флашбек" или читать в автономке,
получим "примерно" старые значения, но оно Вам надо

мне кажется подход не православный
сначало надо
1) select for update (олд значения)
2) сравниваем с новыми (Вы ж их знаете)
3) если подходит update where ...+commit, не подходит коммит без update
4) rollback токо в случае сбоя


.....
stax
...
Рейтинг: 0 / 0
05.12.2017, 16:31
    #39564552
Значение поля до update
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table табля (ключ number, поле number);
insert into табля values (1, -1);
commit;
var пере number

update табля т0 set поле = trunc(dbms_random.value(10,20)) where ключ = 1 returning (select поле from табля т1 where т1.ключ = т0.ключ) into :пере;
select :пере, поле from табля;

     :ПЕРЕ       ПОЛЕ
---------- ----------
        -1         18

update табля т0 set поле = trunc(dbms_random.value(10,20)) where ключ = 1 returning (select поле from табля т1 where т1.ключ = т0.ключ) into :пере;
select :пере, поле from табля;

     :ПЕРЕ       ПОЛЕ
---------- ----------
        18         16

drop table табля purge;
...
Рейтинг: 0 / 0
05.12.2017, 16:51
    #39564567
gfhfyjz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
Все выполняется в одной сессии.
Контролировать перед изменение не получится, так настроена система.
returning не подходит, потому что используется в pl sql, а нужно в чистом sql, потому что отчет строится отдельно без использования pl sql


Staxмне кажется подход не православный
сначало надо
1) select for update (олд значения)
2) сравниваем с новыми (Вы ж их знаете)
3) если подходит update where ...+commit, не подходит коммит без update
4) rollback токо в случае сбоя


По второму пункту, новое значение знаю только когда будет update. в отчет не передается параметр нового значение.

По комментариям понимаю, что от варианта с временной таблицей не обойтись.

Всем спасибо;)
...
Рейтинг: 0 / 0
05.12.2017, 17:09
    #39564577
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzПо комментариям понимаю, что от варианта с временной таблицей не обойтись.Ни хера ты не понял.
...
Рейтинг: 0 / 0
05.12.2017, 17:37
    #39564595
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjz,

заполнение временной, всеравно на какой-то момент времени

тоесть время перед update известно, можно флашбек использовать

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
16:18:25 SQL> select * from t for update;

Z          D
---------- ----------
1          1000
2          2000
3          3000
4          4000
5          5000
6          6000
7          7000
8          8000
9          9000
10         10000
11         11000
12         12000
13         13000

13 rows selected.

16:18:47 SQL> update t set d=d+z;

13 rows updated.

16:19:01 SQL>
16:20:32 SQL> select
16:20:37   2   t1.z,t1.d,t2.z z_old,t2.d d_old
16:20:37   3  from t t1,t as of timestamp (sysdate - 1/24/60) t2
16:20:37   4  where t1.rowid=t2.rowid
16:20:37   5  /

Z          D          Z_OLD      D_OLD
---------- ---------- ---------- ----------
1          1001       1          1000
2          2002       2          2000
3          3003       3          3000
4          4004       4          4000
5          5005       5          5000
6          6006       6          6000
7          7007       7          7000
8          8008       8          8000
9          9009       9          9000
10         10010      10         10000
11         11011      11         11000
12         12012      12         12000
13         13013      13         13000

13 rows selected.

16:20:38 SQL>




.....
stax
...
Рейтинг: 0 / 0
05.12.2017, 18:18
    #39564643
gfhfyjz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
ElicgfhfyjzПо комментариям понимаю, что от варианта с временной таблицей не обойтись.Ни хера ты не понял.

То что я не понял уже догадался, на Ваш коммент не обратил внимание. Раньше такой функционал не использовал, по этому не придал значению. Спасибо.



Stax, отдельное спасибо за подробное объяснение. То что доктор прописал!!!!!!
...
Рейтинг: 0 / 0
05.12.2017, 22:26
    #39564737
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjzТо что доктор прописал!!!!!!
Вряд ли доктор такое прописал бы...
Если уж идти на такие извраты - то хотя бы as of scn, полученный непосредственно перед update, а уж никак не as of timestamp.
...
Рейтинг: 0 / 0
05.12.2017, 22:48
    #39564739
Значение поля до update
andrey_anonymousВряд ли доктор такое прописал бы...Ничего, от побочных эффектов доктор пропишет эксклюзивную блокировку на таблицу и dbms_lock.sleep(3).
...
Рейтинг: 0 / 0
06.12.2017, 07:56
    #39564815
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
andrey_anonymousas of scn, полученный непосредственно перед update, а уж никак не as of timestamp.+
...
Рейтинг: 0 / 0
06.12.2017, 09:50
    #39564849
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение поля до update
gfhfyjz,

А какую реальную задачу мусье решает столь извращёнными способами?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Значение поля до update / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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