Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Запомнить старое значение при Update  [new]
sql_update
Guest
Доброго времени суток, интересует такой вопрос. У меня есть процедура, которая выполняет ряд апдейтов в курсоре. Так вот интересует как запомнить старое значение, новое ясно в принципе.
31 янв 11, 22:19    [10161418]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
Ivan K
Member

Откуда: Москва
Сообщений: 304
sql_update,


CURSOR c1 IS SELECT ...  FROM <table name> WHERE ... FOR UPDATE;
BEGIN
...
OPEN c1;
LOOP
 FETCH c1 INTO ... -- вот они старые значения, запоминайте куда хотите
 EXIT WHEN c1%NOTFOUND;
 IF ...
    update <table_name> set ... where WHERE CURRENT OF C1;
 END IF;
END LOOP;
close c1;
...
END;

короче тут
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/sqloperations.htm#BABJCEIF
1 фев 11, 13:47    [10164424]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
Shtock
Member

Откуда: СПб
Сообщений: 3049
А не проще ли забить на курсоры и использовать стандартные update c returning?
1 фев 11, 18:52    [10166923]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
.
Guest
Shtock
А не проще ли забить на курсоры и использовать стандартные update c returning?


"запомнить старое значение"
1 фев 11, 19:05    [10166984]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
Elic
Member

Откуда:
Сообщений: 29980
Shtock
А не проще ли забить на курсоры и использовать стандартные update c returning?
Так? :
set salary = salary + salary returning salary / 2
А тут как прикажешь? :
set salary = 10000
1 фев 11, 19:09    [10166998]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
-2-
Member

Откуда:
Сообщений: 15330
Elic
А тут как прикажешь? :
set salary = 10000
Поизвращаться-то можно
SQL> variable x varchar2(1)
SQL> update dual d set dummy='Y' returning (select dummy from dual where dummy=d.dummy) into :x;

1 row updated.

SQL> print x

X
--------------------------------------------------------------------------------
X
1 фев 11, 19:46    [10167130]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
Elic
Member

Откуда:
Сообщений: 29980
-2-
Поизвращаться-то можно
returning (select
Да уж... Какое поле, чтобы налететь на баг или ограничения реализации...
1 фев 11, 19:51    [10167155]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Триггером сохранить old значения в PL/SQL таблицу. Только оно нифига не лучше, чем select for update или returning (select сделать, ИМХО.
1 фев 11, 19:55    [10167180]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54383
Интересно, что же означает "запомнить" и зачем?
1 фев 11, 20:46    [10167354]     Ответить | Цитировать Сообщить модератору
 Re: Запомнить старое значение при Update  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
А вот интересно, выделенное ограничение осталось со времен Bug 6134368 / Bug 7411865 ?
Oracle® Database SQL Language Reference 11g Release 2
Restrictions The following restrictions apply to the RETURNING clause:

* The expr is restricted as follows:

o For UPDATE and DELETE statements each expr must be a simple expression or a single-set aggregate function expression.
You cannot combine simple expressions and single-set aggregate function expressions in the same returning_clause.
For INSERT statements, each expr must be a simple expression. Aggregate functions are not supported in an INSERT
statement RETURNING clause.

o Single-set aggregate function expressions cannot include the DISTINCT keyword.

* If the expr list contains a primary key column or other NOT NULL column, then the update statement fails if the table has a BEFORE UPDATE trigger defined on it.

* You cannot specify the returning_clause for a multitable insert.

* You cannot use this clause with parallel DML or with remote objects.

* You cannot retrieve LONG types with this clause.

* You cannot specify this clause for a view on which an INSTEAD OF trigger has been defined.
1 фев 11, 20:48    [10167363]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить