Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 помогите с триггером  [new]
sfvetka
Member

Откуда:
Сообщений: 11
есть небольшая таблица с данными. необходимо сделать триггер, чтобы при записи имени, если оно уже существует, добавить к нему символ.
не могу понять, как тут быть с обращением к самой же таблице
пыталась поиграть с
PRAGMA AUTONOMOUS_TRANSACTION;
все равно не выходит
3 дек 07, 00:19    [4993019]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Софтверный проктолог
Member [заблокирован]

Откуда: Москва
Сообщений: 2230
Покажи код.
3 дек 07, 00:20    [4993021]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
Дизайн очень неважный.

Почитайте FAQ

FAQ: Мутирование таблиц

В 11-ой должно быть немного легче :-)
3 дек 07, 00:23    [4993024]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
dmidek
В 11-ой должно быть немного легче :-)
А что там?
3 дек 07, 10:18    [4993674]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
Jannny
dmidek
В 11-ой должно быть немного легче :-)
А что там?


Compound Triggers

Using Compound Triggers to Avoid Mutating-Table Error

Это в принципе наша FAQ, суженная до размеров триггера.
Обмен переменными происходит в рамках этого триггера.
3 дек 07, 10:56    [4993957]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
dmidek
Jannny
dmidek
В 11-ой должно быть немного легче :-)
А что там?
Compound Triggers
Спасибо.
before и after вместе - это интересно :)
3 дек 07, 11:18    [4994136]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
имхо,особо изощряться для решения такой задачи и не надо.
unique на то имя - и обрабатывать (api) его отказ
3 дек 07, 12:38    [4994810]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Olivier
Member

Откуда:
Сообщений: 3
create or replace trigger tr_a before insert on a for each row
declare
a_count integer;
begin
select count(*) into a_count from a where b = :NEW.b;
if a_count > 0 then
:New.b := ...--dobavljaj simvol
end if;
end;
3 дек 07, 14:41    [4995708]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Elic
Member

Откуда:
Сообщений: 29976
Olivier
Наивный новичёк
3 дек 07, 14:44    [4995737]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
Olivier
create or replace trigger tr_a before insert on a for each row
declare
a_count integer;
begin
select count(*) into a_count from a where b = :NEW.b;
if a_count > 0 then
:New.b := ...--dobavljaj simvol
end if;
end;


Сами пробовали ?
3 дек 07, 14:45    [4995744]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
vds
Member

Откуда:
Сообщений: 372
Olivier


И старайтесь даже неработающий код оформлять с помощью тега src. Его так намного удобнее читать!!!

create or replace trigger tr_a before insert on a for each row
  declare
    a_count integer;
  begin
    select count(*)  into a_count  from a where b = :NEW.b;
    if a_count > 0 then
       :New.b := ...--dobavljaj simvol 
    end if;
  end;
3 дек 07, 15:05    [4995921]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
ankalex
Member

Откуда:
Сообщений: 129
вообще-то код работающий, хотя, конечно, он не гарантирует на 100%, что при одновременной вставке не появится нарушение уникальности
3 дек 07, 15:46    [4996273]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Elic
Member

Откуда:
Сообщений: 29976
ankalex
вообще-то код работающий, хотя, конечно, он не гарантирует на 100%, что при одновременной вставке не появится нарушение уникальности
Он не только в этом не работающий :)
3 дек 07, 15:51    [4996319]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Olivier
Member

Откуда:
Сообщений: 3
вообще-то пробовал и все работает, а если вы такие опытные то что же вы толково не объясните где собака зарыта? насчет одновременной попытки это верно, но все зависит от Application
3 дек 07, 16:28    [4996631]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
Olivier
вообще-то пробовал и все работает


Тебе повезло

Olivier

, а если вы такие опытные то что же вы толково не объясните где собака зарыта?


SQL> create table a (b int);

Table created.

SQL> create or replace trigger tr_a before insert on a for each row
  2  declare
  3  a_count integer;
  4  begin
  5  select count(*) into a_count from a where b = :NEW.b;
  6  if a_count > 0 then
  7  :New.b := :new.b + 1;
  8  end if;
  9  end;
 10  /

Trigger created.

SQL> insert into a select rownum from dual connect by level <= 3;
insert into a select rownum from dual connect by level <= 3
            *
ERROR at line 1:
ORA-04091: table SCOTT.A is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.TR_A", line 4
ORA-04088: error during execution of trigger 'SCOTT.TR_A'

Olivier
насчет одновременной попытки это верно, но все зависит от Application


Computer doesn't make suggestions and programmers shouldn't (c)
3 дек 07, 16:48    [4996785]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
Кстати вопрос к автору

Что должно получиться при такой последовательности действий ?

insert into scott.a values (1, 'A')
/
insert into scott.a values (1, 'A')
/
insert into scott.a values (1, 'A')
/

:-)
3 дек 07, 16:50    [4996817]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Elic
Member

Откуда:
Сообщений: 29976
Olivier
вообще-то пробовал и все работает, а если вы такие опытные то что же вы толково не объясните где собака зарыта?
Это столько раз объяснялось, что даже лень посылать в поиск
Особый случай конкретно для тебя:
insert into a(b, ...) values('Olivier', ...);
insert into a(b, ...) values('Olivier', ...);
insert into a(b, ...) values('Olivier', ...);
3 дек 07, 16:55    [4996873]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Olivier
Member

Откуда:
Сообщений: 3
очень рекомендую поучиться культуре общения на форуме тома кайта: http://asktom.oracle.com, а у него то опыта чай по-больше чем у некоторых...
я думал здесь идет речь об обмене опытом а оказывается важно просто поразить непонятно чем...
кстати, причем тут hierarchical query - человек просто имя хотел изменить/запомнить.
3 дек 07, 17:20    [4997094]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116070
Olivier
очень рекомендую поучиться культуре общения на форуме тома кайта: http://asktom.oracle.com, а у него то опыта чай по-больше чем у некоторых...
я думал здесь идет речь об обмене опытом а оказывается важно просто поразить непонятно чем...
кстати, причем тут hierarchical query - человек просто имя хотел изменить/запомнить.


Культура...
Кстати Том Кайт при всей своей культуре апломб очень быстро сбивает...

Помимо высокой культуры у Тома Кайте есть еще чему поучиться.
Например не публиковать нерабочее решение ...

В примере ДГ connect by был не главное. Там insert select был главное.

Смотрите.
Многопользовательский режим - не работает.
INSERT SELECT - не работает.
Три одинаковых INSERT VALUES - не работает.

О чем мы говорим вообще ?
3 дек 07, 17:26    [4997137]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Elic
Member

Откуда:
Сообщений: 29976
Olivier
очень рекомендую поучиться культуре общения на форуме тома кайта: http://asktom.oracle.com, а у него то опыта чай по-больше чем у некоторых...
Ну так и иди молиться в ту церковь :) Смотри, только лоб не расшиби
Olivier
кстати, причем тут hierarchical query - человек просто имя хотел изменить/запомнить.
Вот видишь, широко известных трюков не знаешь, условий отсутствия runtime-ошибок в своём триггере - тоже, а лезешь рассуждать о какой-то "культуре"
3 дек 07, 17:27    [4997147]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
Olivier
очень рекомендую поучиться культуре общения на форуме тома кайта: http://asktom.oracle.com, а у него то опыта чай по-больше чем у некоторых...
я думал здесь идет речь об обмене опытом а оказывается важно просто поразить непонятно чем...
кстати, причем тут hierarchical query - человек просто имя хотел изменить/запомнить.


Про культуру общения ты будешь иметь право толковать, когда достигнешь уровня,
при котором тутошним людям не нужно будет разжевывать тебе твои элементарные ошибки.
Пока что ты - самонадеяный воинствующий ламер, и не заметно, чтобы ты это понимал.
3 дек 07, 17:32    [4997193]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
Дубовая голова
Member [заблокирован]

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


О культуре, разумеется...

"Когда я слышу слово 'культура', я хватаюсь за пистолет" (c)

(Сорри за оффтоп).
3 дек 07, 17:38    [4997252]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
sfvetka
Member

Откуда:
Сообщений: 11
dmidek
Кстати вопрос к автору

Что должно получиться при такой последовательности действий ?

insert into scott.a values (1, 'A')
/
insert into scott.a values (1, 'A')
/
insert into scott.a values (1, 'A')
/

:-)

По идее
А+
А++
А+++
Но данных мало, так что этого не должно получиться :)

2dmidek thx. полезная статья... читаю
6 дек 07, 00:48    [5009688]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
Olivier
вообще-то пробовал и все работает, а если вы такие опытные то что же вы толково не объясните где собака зарыта? насчет одновременной попытки это верно, но все зависит от Application


собака зарыта here: If you insert a single row using VALUES clause - no mutation occurs:

SQL> create table a(b varchar2(10))
  2  /

Table created.

SQL> create or replace trigger tr_a before insert on a for each row
  2  declare
  3  a_count integer;
  4  begin
  5  select count(*) into a_count from a where b = :NEW.b;
  6  if a_count > 0 then
  7  :New.b := :New.b || '+'; --dobavljaj simvol 
  8  end if;
  9  end;
 10  /

Trigger created.

SQL> insert into a values('Oliver');

1 row created.

SQL> insert into a values('Oliver');

1 row created.

SQL> insert into a values('Oliver');

1 row created.

SQL> select * from a;

B
----------
Oliver
Oliver+
Oliver+

SQL> insert into a select 'Oliver' from dual;
insert into a select 'Oliver' from dual
            *
ERROR at line 1:
ORA-04091: table SCOTT.A is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.TR_A", line 4
ORA-04088: error during execution of trigger 'SCOTT.TR_A'


SQL> insert into a select 'Oliver' from emp;
insert into a select 'Oliver' from emp
            *
ERROR at line 1:
ORA-04091: table SCOTT.A is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.TR_A", line 4
ORA-04088: error during execution of trigger 'SCOTT.TR_A'


SQL> 

SY.

Сообщение было отредактировано: 6 дек 07, 03:40
6 дек 07, 02:56    [5009858]     Ответить | Цитировать Сообщить модератору
 Re: помогите с триггером  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
sfvetka
По идее
А+
А++
А+++


How about:

SQL> create table a(b varchar2(100))
  2  /

Table created.

SQL> ALTER TABLE A
  2    ADD CONSTRAINT A_PK
  3      PRIMARY KEY(b)
  4  /

Table altered.

SQL> create or replace
  2    view a_view as select * from a
  3  /

View created.

SQL> create or replace
  2    trigger a_view_iir
  3      instead of insert
  4      on a_view
  5      for each row
  6      declare
  7          a_count integer;
  8      begin
  9      select  count(*)
 10        into  a_count
 11        from  a
 12        start with b = :NEW.b
 13        connect by b = prior b || '+';
 14      insert into a values(:New.b || lpad('+',a_count,'+')); 
 15    end;
 16  /

Trigger created.

SQL> create or replace trigger tr_a before insert on a for each row
  2    declare
  3        owner    varchar2(30);
  4        name     varchar2(30);
  5        lineno   varchar2(30);
  6        caller_t varchar2(30);
  7    begin
  8        who_called_me(owner,
  9                      name,
 10                      lineno,
 11                      caller_t
 12                     );
 13        if nvl(owner,' ') <> 'SCOTT' or  nvl(name,' ') <> 'A_VIEW_IIR'
 14          then
 15            raise_application_error(-20900,'Direct insert is not allowed. Please insert into view a_view.');
 16        end if;
 17    end;
 18  /

Trigger created.

SQL> insert into a select 'Oliver' from emp;
insert into a select 'Oliver' from emp
            *
ERROR at line 1:
ORA-20900: Direct insert is not allowed. Please insert into view a_view.
ORA-06512: at "SCOTT.TR_A", line 14
ORA-04088: error during execution of trigger 'SCOTT.TR_A'


SQL> insert into a_view select 'Oliver' from emp;

14 rows created.

SQL> select * from a;

B
--------------------------------------------------------------------------------
Oliver
Oliver+
Oliver++
Oliver+++
Oliver++++
Oliver+++++
Oliver++++++
Oliver+++++++
Oliver++++++++
Oliver+++++++++
Oliver++++++++++

B
--------------------------------------------------------------------------------
Oliver+++++++++++
Oliver++++++++++++
Oliver+++++++++++++

14 rows selected.

SQL> 

SY.
6 дек 07, 05:34    [5009895]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить