Триггер Oracle для проверки увеличения значения - PullRequest
0 голосов
/ 24 декабря 2018

Можно ли проверить, было ли значение увеличено в операторе обновления?

Например:

Table1 (id number,  Value number)

Insert into Table1(id, Value) values(1, 2);

UPDATE Table1
SET value = 3
WHERE id = 1

Мне нужно знать, увеличилось ли новое значение.

Спасибо

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Вы можете использовать структуру returning .. into .., чтобы увидеть новое увеличенное значение, как показано в следующем блоке:

SQL> create table Table1( id number, value number );

Table created

SQL> insert into Table1(id, Value) values(1, 2);

1 row inserted

SQL> set serveroutput on;
SQL> 
SQL> declare
  2   new_value Table1.value%type;
  3  begin
  4   update Table1
  5      set value = 3
  6    where id = 1
  7    returning value into new_value;
  8   dbms_output.put_line(' New Value returned is '||new_value);
  9  end;
 10  /

 New Value returned is 3

PL/SQL procedure successfully completed

SQL> commit;

Commit complete
0 голосов
/ 24 декабря 2018

Проблема с триггером в том, что он не связывается с исполняемым кодом.Так что триггер не годится, если нам нужно, чтобы наша программа выбрала одну или несколько разных веток в зависимости от результата оператора UPDATE.

Мы можем использовать sql%found (или sql%notfound), чтобы проверить, касалось ли наше утверждение DML каких-либо записей.

UPDATE Table1
SET value = 3
WHERE id = 1;

if sql%found then 
    dbms_output.put_line('record updated');
else
    dbms_output.put_line('record NOT updated');
end if; 

Если у нас есть утверждение, которое может повлиять на несколько записей, мыможно использовать sql%count для получения количества затронутых записей.

UPDATE Table1
SET value = 3
WHERE id > 123;

dbms_output.put_line('No of records updated = ' || sql%count);

Если вы хотите получить обновленное значение, используйте предложение returning into:

UPDATE Table1
SET value = value + 3
WHERE id = 1
returning value into l_value;

dbms_output.put_line('updated value = ' || l_value);
0 голосов
/ 24 декабря 2018

Ваш вопрос не очень понятен, но, надеюсь, нижеприведенное даст вам старт.

TRIGGER table1_update BEFORE UPDATE ON table1
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
BEGIN
   IF :NEW.value > :OLD.value then
      -- value has been incremented do what you need to do
   else if :NEW.value < :OLD.value then
      -- value has been decremented do what you need to do
   else
      -- value must be the same do whatever you need to do
   end if;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...