Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Предикаты inserting, updating, deleting в PL/SQL  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
Приветствую, коллеги.
Возможно, это старый баян, но поиском не нашел.

SQL> create or replace procedure avm_test_proc as
  2  begin
  3    if inserting then Dbms_Output.Put_Line('Inserting!'); end if;
  4    if not inserting then Dbms_Output.Put_Line('NOT Inserting!'); end if;
  5    if updating then Dbms_Output.Put_Line('Updating!'); end if;
  6    if not updating then Dbms_Output.Put_Line('NOT Updating!'); end if;
  7    if deleting then Dbms_Output.Put_Line('Deleting!'); end if;
  8    if not deleting then Dbms_Output.Put_Line('NOT Deleting!'); end if;
  9  end;
 10  /

Процедура создана.

SQL> exec avm_test_proc
NOT Inserting!
NOT Updating!
NOT Deleting!

Процедура PL/SQL успешно завершена.

SQL> create table avm_test (n number);

Таблица создана.

SQL> create trigger avm_test_biud before insert or update or delete on avm_test for each row
  2  begin avm_test_proc; end;
  3  /

Триггер создан.

SQL> insert into avm_test values (1);
Inserting!
NOT Updating!
NOT Deleting!

1 строка создана.

SQL> update avm_test set n = 2;
NOT Inserting!
Updating!
NOT Deleting!

1 строка обновлена.

SQL> delete avm_test;
NOT Inserting!
NOT Updating!
Deleting!

1 строка удалена.

SQL>

Собственно, вопрос к знающим: что это за фича/бага?
В доке нашел только это:
Application Developer's Guide - Fundamentals
Note:

The INSERTING, DELETING, and UPDATING conditional predicates cannot be used for the CALL procedures; they can only be used in a PL/SQL block.

Однако с CALL та же картина. :) Кстати, вложенность процедур не имеет значения.
19 мар 08, 16:45    [5431506]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Elic
Member

Откуда:
Сообщений: 29990
wildwind
Собственно, вопрос к знающим: что это за фича/бага?
Что конкретно ты не понял в доке?
19 мар 08, 16:55    [5431583]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
В доке все понятно.
Там такое поведение не описано.
19 мар 08, 17:09    [5431730]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Elic
Member

Откуда:
Сообщений: 29990
wildwind
Там такое поведение не описано.
Зоя Космодемьянская?
Какое "такое"?!
19 мар 08, 17:20    [5431848]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
Elic, из вас бы вышел суровый препод-экзаменатор


Elic
Какое "такое"?!

В PL/SQL коде, не являющемся телом триггера, присутствует ссылка на предикат inserting. Код компилируется без ошибок. При обычном вызове результат такой, при вызове из триггера сякой. Что еще непонятно в примере?

Elic
Зоя Космодемьянская?

Не просек ассоциацию.
19 мар 08, 17:29    [5431949]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Oleg Afanasiev
Member

Откуда: Киев
Сообщений: 3742
Elic
Зоя Космодемьянская?

Гладиолус :)
19 мар 08, 17:35    [5432014]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
wildwind
Что еще непонятно в примере?


Непонятно, зачем ты читал доку по диагонали:

автор

The trigger body for row triggers has some special constructs
that can be included in the code of the PL/SQL block: correlation names and the REFERENCEING option, and the conditional predicates INSERTING, DELETING, and UPDATING.
19 мар 08, 17:39    [5432046]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
трригг
Guest
wildwind
Приветствую, коллеги.
Собственно, вопрос к знающим: что это за фича/бага?
В доке нашел только это:
Application Developer's Guide - Fundamentals
Note:

The INSERTING, DELETING, and UPDATING conditional predicates cannot be used for the CALL procedures; they can only be used in a PL/SQL block.

Однако с CALL та же картина. :) Кстати, вложенность процедур не имеет значения.


В книге "Oracle для профи" Фейрштенйа написано следующее:
автор
данные директивы можно вызывать из любого кода PL/SQL, а не только в триггерах. Однако значение TRUE они возвращают лишь в том случае, если используются в триггерах или программах вызванных из таковых.

"из таковых" - я понимаю как "из триггеров"
19 мар 08, 17:45    [5432101]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
трригг

В книге "Oracle для профи" Фейрштенйа написано следующее:
автор
данные директивы можно вызывать из любого кода PL/SQL, а не только в триггерах. Однако значение TRUE они возвращают лишь в том случае, если используются в триггерах или программах вызванных из таковых.

Да, именно это я и определил экспериментально. Меня интересует "зачем" и "почему именно так". Есть случаи, когда без этого не обойтись? Или раньше были? Предполагаю, что это связано с историей развития PL/SQL. Археологический интерес, короче :).


Дубовая голова
Непонятно, зачем ты читал доку по диагонали:

Все-таки это вы не поняли, что мне нужно.
19 мар 08, 18:16    [5432334]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
wildwind

Да, именно это я и определил экспериментально. Меня интересует "зачем" и "почему именно так". Есть случаи, когда без этого не обойтись? Или раньше были? Предполагаю, что это связано с историей развития PL/SQL. Археологический интерес, короче :).


Например, если тело триггера больше определенного размера (цифру сейчас не помню), рекомендуется его текст запихивать в процедуру...
19 мар 08, 18:20    [5432356]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
wildwind
Меня интересует "зачем" и "почему именно так".


Включи моск и попробуй подумать, что означает INSERTING, UPDATING и DELETING.
Подсказка - какой смысл в функции INSERTING без триггера ? Еще подсказка -
что означает ing-овая форма в английскойм языке ?

wildwind

Все-таки это вы не поняли, что мне нужно.


Зато я понял, что ты любитель морочить голову сам себе.
19 мар 08, 18:21    [5432363]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Консерва
Member

Откуда:
Сообщений: 2794
tru55
wildwind

Да, именно это я и определил экспериментально. Меня интересует "зачем" и "почему именно так". Есть случаи, когда без этого не обойтись? Или раньше были? Предполагаю, что это связано с историей развития PL/SQL. Археологический интерес, короче :).


Например, если тело триггера больше определенного размера (цифру сейчас не помню), рекомендуется его текст запихивать в процедуру...
32К
19 мар 08, 18:22    [5432366]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
TiG
Member

Откуда:
Сообщений: 780
tru55
wildwind

Да, именно это я и определил экспериментально. Меня интересует "зачем" и "почему именно так". Есть случаи, когда без этого не обойтись? Или раньше были? Предполагаю, что это связано с историей развития PL/SQL. Археологический интерес, короче :).


Например, если тело триггера больше определенного размера (цифру сейчас не помню), рекомендуется его текст запихивать в процедуру...

а также думается чтобы можно было использовать вот такую форму определения триггера:
CREATE TRIGGER trg BEFORE INSERT ON tbl FOR EACH ROW
   CALL trg_proc(:new.id, :new.data)
19 мар 08, 18:36    [5432442]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Elic
Member

Откуда:
Сообщений: 29990
wildwind
Меня интересует "зачем" и "почему именно так".
Это обыкновенные функции. RTFM dbmsstdx.sql
19 мар 08, 18:38    [5432453]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
В дополнение ко всему вышесказанному:

SQL> create or replace function f1
  2  return number
  3  is
  4  begin
  5   if inserting then
  6    dbms_output.put_line('Inserting');
  7   else
  8    dbms_output.put_line('Not inserting');
  9  end if;
 10  return 1;
 11  end;
 12  /

Function created.

SQL> insert into t values(f1);
Inserting

1 row created.

SQL> var x number
SQL> exec :x := f1;
Not inserting

PL/SQL procedure successfully completed.
19 мар 08, 18:41    [5432470]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
tru55
Например, если тело триггера больше определенного размера (цифру сейчас не помню), рекомендуется его текст запихивать в процедуру...

Мы сейчас этим и занимаемся - переносим код из триггеров в пакеты. И встает вопрос: можно ли смело использовать напрямую или лучше передавать как boolean параметры. Фейрштейну я готов поверить, но неупоминание в доке смущает; может есть другие мнения/опыт?

Elic
Это обыкновенные функции. RTFM dbmsstdx.sql

Спасибо за наводку! А внутри наверное переменные :)

TiG
а также думается чтобы можно было использовать вот такую форму определения триггера:

Да, это наводит на мысль, что может когда-то были только CALL-триггеры, а begin...end не было. А может реализация стандартными функциями оказалась самой простой.
19 мар 08, 19:02    [5432601]     Ответить | Цитировать Сообщить модератору
 Re: Предикаты inserting, updating, deleting в PL/SQL  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
Дубовая голова
В дополнение ко всему вышесказанному:


And behavior in MERGE:

SQL> drop table test1
  2  /

Table dropped.

SQL> create table test1(x number,y varchar2(20))
  2  /

Table created.

SQL> insert into test1(x) select level from dual connect by level < 6
  2  /

5 rows created.

SQL> create or replace
  2    function f1(x number)
  3      return varchar2
  4      is
  5      begin
  6          if inserting
  7            then
  8              dbms_output.put_line('Inserting ' || x);
  9              return 'Inserting ' || x;
 10          end if;
 11          if updating
 12            then
 13              dbms_output.put_line('Updating ' || x);
 14              return 'Updating ' || x;
 15          end if;
 16          if deleting
 17            then
 18              dbms_output.put_line('Deleting ' || x);
 19              return NULL;
 20            else
 21              dbms_output.put_line('Not set ' || x);
 22              return NULL;
 23          end if;
 24  end;
 25  /

Function created.

SQL> set serveroutput on
SQL> merge into test1
  2  using (select rownum r from emp)
  3  on (x = r)
  4  when matched then update set y = f1(x) delete where x < 3 and f1(x) is not null
  5  when not matched then insert values(r,f1(r))
  6  /
Updating 1
Updating 1
Updating 2
Updating 2
Updating 3
Updating 4
Updating 5
Inserting 8
Inserting 12
Inserting 10
Inserting 7
Inserting 14
Inserting 9
Inserting 13
Inserting 11
Inserting 6

14 rows merged.

SQL> select * from test1
  2  /

         X Y
---------- --------------------
         3 Updating 3
         4 Updating 4
         5 Updating 5
         8 Inserting 8
        12 Inserting 12
        10 Inserting 10
         7 Inserting 7
        14 Inserting 14
         9 Inserting 9
        13 Inserting 13
        11 Inserting 11

         X Y
---------- --------------------
         6 Inserting 6

12 rows selected.

SQL> 

SY.
19 мар 08, 19:12    [5432644]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить