powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работа с Триггерами
15 сообщений из 15, страница 1 из 1
Работа с Триггерами
    #39261304
lasosyapwnz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть моей задачи такова: мне нужно создать compound trigger на вставку для таблицы 1, который бы выполнял следующие действия - если число НЕ содержится в таблице 1, то вставить в таблицу 1, иначе вставить в таблицу 2.
Как это реализовать?
Как делаю я: создаю comp trigger на вставку для таблицы 1.
Время выполнения триггера - BEFORE STATEMENT.
Если условие выполняется - то ничего не делаю, вставка пройдет сама в таблицу 1, в противном случае - делаю INSERT для таблицы 2, завершая его с помощью брейка (RAISE_APPLICATION_ERROR), чтобы не было добавлено информации в таблицу 1. Это сделано для того, чтобы триггер не добавил данных в таблицу 1.
Сам вопрос - возможно ли это сделать по-другому? Я сделал все через *опу? :D

КОД:

set serveroutput on;
CREATE OR REPLACE TRIGGER my_trg
FOR INSERT ON member --название таблицы member
COMPOUND TRIGGER

BEFORE STATEMENT IS
BEGIN
IF 1=2 THEN
DBMS_OUTPUT.PUT_LINE('INSERT INTO TABLE 1');
ELSE
Raise_application_error(-20001,'INSERT INTO TABLE 2');
END IF;
END BEFORE STATEMENT;
END my_trg;

/
INSERT INTO member VALUES(5,2,1);
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261327
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lasosyapwnz,

делай инсерт в таблицу2, а таблицу1 создай как вью или матвью он коммит.
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261379
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lasosyapwnz,

А как вы узнаете вставляемые значения BEFORE STATEMENT?
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261443
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на основе INSTEAD OF
Код: plaintext
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
SQL> create table t1 as select 1 a from dual;

Table created.

SQL> create unique index t1_i1 on t1(a);

Index created.

SQL> create table t2 as select 2 a from dual;

Table created.

SQL> create or replace view v1 as select * from t1;

View created.

SQL> create trigger v1_tr1
  2  instead of insert
  3  on v1
  4  begin
  5     insert into t1(a) values (:new.a);
  6  exception
  7     when dup_val_on_index then
  8             insert into t2(a) values (:new.a);
  9  end;
 10  /

Trigger created.

SQL> insert into v1(a) values(1);

1 row created.

SQL> select * from t1;
         A
----------
         1

SQL> select * from t2;
         A
----------
         2
         1

SQL> insert into v1(a) values(2);

1 row created.

SQL> select * from t1;
         A
----------
         1
         2

SQL> select * from t2;
         A
----------
         2
         1
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261531
lasosyapwnz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene-- , у меня задача именно в реализации триггера для таблицы, про instead of я в курсе, он очень удобен, но только для view.
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261532
lasosyapwnz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--lasosyapwnz,

А как вы узнаете вставляемые значения BEFORE STATEMENT?
спасибо, это я не учел, подумаю.:)
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261580
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lasosyapwnz,

Если это препод вам такие задачи ставит, скажите ему, нечего изобретать велисопед и пичкать абитуру всякой хренью.
Пусть даёт практически полезные задачи.
Используйте MERGE
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261614
Склероз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько помню, компаунд совмещают в себе онстейтмент и онроу триггеры.
Возможно, препод хочет, чтобы вы использовали коллекции?
То есть собриаешь отдельно все, что надо сложить в тэйбл2 и потом через форалл инсертишь в автер стейтмент части.
Но на больших объемах понятно что будет не очень хорошо.
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261781
lasosyapwnz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--lasosyapwnz,

Если это препод вам такие задачи ставит, скажите ему, нечего изобретать велисопед и пичкать абитуру всякой хренью.
Пусть даёт практически полезные задачи.
Используйте MERGE
Вот такой вот у меня преподаватель))
спасибо
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261786
lasosyapwnz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СклерозНасколько помню, компаунд совмещают в себе онстейтмент и онроу триггеры.
Возможно, препод хочет, чтобы вы использовали коллекции?
То есть собриаешь отдельно все, что надо сложить в тэйбл2 и потом через форалл инсертишь в автер стейтмент части.
Но на больших объемах понятно что будет не очень хорошо.
да, я такой вариант тоже сейчас обдумываю
но сложность в реализации тут такая - pragma autonomous_transcation не работает для comp. trigger'a, поэтому заселектить все не получится, будет ошибка мутации
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39261799
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да что ж за эпидемия. читать не умеют, искать не умеют, задачу сформулировать не умеют, выдвигают всякие домыслы, но проверить/опровергнуть самостоятельно их не умеют.
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39262085
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lasosyapwnz(...) compound trigger на вставку для таблицы 1, который бы выполнял следующие действия - если число НЕ содержится в таблице 1, то вставить в таблицу 1, иначе вставить в таблицу 2 (...)вообще говоря, "триггер на вставку" не может запретить вставку строки в таблицу, а именно это вы хотите после слова " иначе " (кроме как бросанием исключения, но этот вариант не рассматриваем, поскольку исключение будет видно извне триггера).
Поэтому сформулируйте требования по-другому.
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39262133
lasosyapwnz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--lasosyapwnz(...) compound trigger на вставку для таблицы 1, который бы выполнял следующие действия - если число НЕ содержится в таблице 1, то вставить в таблицу 1, иначе вставить в таблицу 2 (...)вообще говоря, "триггер на вставку" не может запретить вставку строки в таблицу, а именно это вы хотите после слова " иначе " (кроме как бросанием исключения, но этот вариант не рассматриваем, поскольку исключение будет видно извне триггера).
Поэтому сформулируйте требования по-другому.
Передо мной именно такое задание)))
https://pp.vk.me/c636228/v636228989/139fc/KfCiZ3c9nEo.jpg
может я не так понял задание?
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39262184
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lasosyapwnzможет я не так понял задание?конечно. ведь в картинке нету условия "таблица1 ИЛИ таблица2".
там "таблица1 И ИНОГДА таблица2".
хотя, судя но именованию таблиц/колонок уже можно понять говнокодерственность автора задания. чем так, уж лучше бы обозвал их просто буквами a, b, c...
вашу мать! вот оно в чем дело! - говнопреподы штампуют говнокодеров! :(
говносолюшен
Код: plaintext
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
SQL> create table member_(gr_id number not null, un_id number not null, carr number not null, primary key (gr_id, un_id));

Table created.

SQL> create table carr_ch(gr_id number not null, old_carr number not null, new_carr number not null);

Table created.

SQL> create or replace trigger member_t1
  2  for insert
  3  on member_
  4  compound trigger
  5     type table_of_number is table of number;
  6     inserted_gr_id table_of_number := table_of_number();
  7     inserted_un_id table_of_number := table_of_number();
  8  after each row is
  9  begin
 10     inserted_gr_id.extend;
 11     inserted_gr_id(inserted_gr_id.last) := :new.gr_id;
 12     inserted_un_id.extend;
 13     inserted_un_id(inserted_un_id.last) := :new.un_id;
 14  end after each row;
 15  after statement is
 16     a number;
 17  begin
 18     for i in 1..inserted_gr_id.count loop
 19             insert into carr_ch(gr_id, old_carr, new_carr)
 20                     select gr_id, old_carr, new_carr
 21                             from (
 22                                     select gr_id, un_id, lag(carr) over (order by un_id) old_carr, carr new_carr
 23                                             from member_
 24                                             where gr_id = inserted_gr_id(i))
 25                             where un_id = inserted_un_id(i)
 26                                     and new_carr != old_carr;
 27     end loop;
 28  end after statement;
 29  end member_t1;
 30  /

Trigger created.

SQL> insert into member_(gr_id, un_id, carr) values(1, 1, 7);

1 row created.

SQL> select * from member_ where gr_id = 1;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7

SQL> select * from carr_ch where gr_id = 1;

no rows selected

SQL> insert into member_(gr_id, un_id, carr) values(1, 2, 6);

1 row created.

SQL> select * from member_;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7
         1          2          6

SQL> select * from carr_ch;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         1          7          6

SQL> insert into member_(gr_id, un_id, carr) values(1, 5, 6);

1 row created.

SQL> select * from member_ where gr_id = 1;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7
         1          2          6
         1          5          6

SQL> select * from carr_ch where gr_id = 1;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         1          7          6

SQL> insert into member_(gr_id, un_id, carr) values(1, 7, 7);

1 row created.

SQL> select * from member_ where gr_id = 1;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7
         1          2          6
         1          5          6
         1          7          7

SQL> select * from carr_ch where gr_id = 1;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         1          7          6
         1          6          7

SQL> insert into member_(gr_id, un_id, carr) values(2, 7, 8);

1 row created.

SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8

SQL> select * from carr_ch where gr_id = 2;

no rows selected

SQL> insert into member_(gr_id, un_id, carr) values(2, 9, 0);

1 row created.

SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8
         2          9          0

SQL> select * from carr_ch where gr_id = 2;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         2          8          0

SQL> insert into member_(gr_id, un_id, carr) values(2, 8, 0);

1 row created.

SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8
         2          9          0
         2          8          0

SQL> select * from carr_ch where gr_id = 2;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         2          8          0
         2          8          0

SQL> insert into member_(gr_id, un_id, carr) values(2, 8, 1);
insert into member_(gr_id, un_id, carr) values(2, 8, 1)
*
ERROR at line 1:
ORA-00001: unique constraint (SANDBOX.SYS_C0010246) violated


SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8
         2          9          0
         2          8          0

SQL> select * from carr_ch where gr_id = 2;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         2          8          0
         2          8          0

SQL> insert into member_(gr_id, un_id, carr)
  2  select 3, 5, 1 from dual
  3  union all select 3, 7, 5 from dual
  4  union all select 3, 9, 5 from dual;

3 rows created.

SQL> select * from member_ where gr_id = 3;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         3          5          1
         3          7          5
         3          9          5

SQL> select * from carr_ch where gr_id = 3;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         3          1          5

SQL> insert into member_(gr_id, un_id, carr)
  2  select 4, 5, 1 from dual
  3  union all select 4, 7, 5 from dual
  4  union all select 4, 7, 5 from dual;
insert into member_(gr_id, un_id, carr)
*
ERROR at line 1:
ORA-00001: unique constraint (SANDBOX.SYS_C0010246) violated


SQL> select * from member_ where gr_id = 4;

no rows selected

SQL> select * from carr_ch where gr_id = 4;

no rows selected
...
Рейтинг: 0 / 0
Работа с Триггерами
    #39262190
lasosyapwnz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--lasosyapwnzможет я не так понял задание?конечно. ведь в картинке нету условия "таблица1 ИЛИ таблица2".
там "таблица1 И ИНОГДА таблица2".
хотя, судя но именованию таблиц/колонок уже можно понять говнокодерственность автора задания. чем так, уж лучше бы обозвал их просто буквами a, b, c...
вашу мать! вот оно в чем дело! - говнопреподы штампуют говнокодеров! :(
говносолюшен
Код: plaintext
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
SQL> create table member_(gr_id number not null, un_id number not null, carr number not null, primary key (gr_id, un_id));

Table created.

SQL> create table carr_ch(gr_id number not null, old_carr number not null, new_carr number not null);

Table created.

SQL> create or replace trigger member_t1
  2  for insert
  3  on member_
  4  compound trigger
  5     type table_of_number is table of number;
  6     inserted_gr_id table_of_number := table_of_number();
  7     inserted_un_id table_of_number := table_of_number();
  8  after each row is
  9  begin
 10     inserted_gr_id.extend;
 11     inserted_gr_id(inserted_gr_id.last) := :new.gr_id;
 12     inserted_un_id.extend;
 13     inserted_un_id(inserted_un_id.last) := :new.un_id;
 14  end after each row;
 15  after statement is
 16     a number;
 17  begin
 18     for i in 1..inserted_gr_id.count loop
 19             insert into carr_ch(gr_id, old_carr, new_carr)
 20                     select gr_id, old_carr, new_carr
 21                             from (
 22                                     select gr_id, un_id, lag(carr) over (order by un_id) old_carr, carr new_carr
 23                                             from member_
 24                                             where gr_id = inserted_gr_id(i))
 25                             where un_id = inserted_un_id(i)
 26                                     and new_carr != old_carr;
 27     end loop;
 28  end after statement;
 29  end member_t1;
 30  /

Trigger created.

SQL> insert into member_(gr_id, un_id, carr) values(1, 1, 7);

1 row created.

SQL> select * from member_ where gr_id = 1;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7

SQL> select * from carr_ch where gr_id = 1;

no rows selected

SQL> insert into member_(gr_id, un_id, carr) values(1, 2, 6);

1 row created.

SQL> select * from member_;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7
         1          2          6

SQL> select * from carr_ch;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         1          7          6

SQL> insert into member_(gr_id, un_id, carr) values(1, 5, 6);

1 row created.

SQL> select * from member_ where gr_id = 1;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7
         1          2          6
         1          5          6

SQL> select * from carr_ch where gr_id = 1;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         1          7          6

SQL> insert into member_(gr_id, un_id, carr) values(1, 7, 7);

1 row created.

SQL> select * from member_ where gr_id = 1;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         1          1          7
         1          2          6
         1          5          6
         1          7          7

SQL> select * from carr_ch where gr_id = 1;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         1          7          6
         1          6          7

SQL> insert into member_(gr_id, un_id, carr) values(2, 7, 8);

1 row created.

SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8

SQL> select * from carr_ch where gr_id = 2;

no rows selected

SQL> insert into member_(gr_id, un_id, carr) values(2, 9, 0);

1 row created.

SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8
         2          9          0

SQL> select * from carr_ch where gr_id = 2;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         2          8          0

SQL> insert into member_(gr_id, un_id, carr) values(2, 8, 0);

1 row created.

SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8
         2          9          0
         2          8          0

SQL> select * from carr_ch where gr_id = 2;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         2          8          0
         2          8          0

SQL> insert into member_(gr_id, un_id, carr) values(2, 8, 1);
insert into member_(gr_id, un_id, carr) values(2, 8, 1)
*
ERROR at line 1:
ORA-00001: unique constraint (SANDBOX.SYS_C0010246) violated


SQL> select * from member_ where gr_id = 2;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         2          7          8
         2          9          0
         2          8          0

SQL> select * from carr_ch where gr_id = 2;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         2          8          0
         2          8          0

SQL> insert into member_(gr_id, un_id, carr)
  2  select 3, 5, 1 from dual
  3  union all select 3, 7, 5 from dual
  4  union all select 3, 9, 5 from dual;

3 rows created.

SQL> select * from member_ where gr_id = 3;
     GR_ID      UN_ID       CARR
---------- ---------- ----------
         3          5          1
         3          7          5
         3          9          5

SQL> select * from carr_ch where gr_id = 3;
     GR_ID   OLD_CARR   NEW_CARR
---------- ---------- ----------
         3          1          5

SQL> insert into member_(gr_id, un_id, carr)
  2  select 4, 5, 1 from dual
  3  union all select 4, 7, 5 from dual
  4  union all select 4, 7, 5 from dual;
insert into member_(gr_id, un_id, carr)
*
ERROR at line 1:
ORA-00001: unique constraint (SANDBOX.SYS_C0010246) violated


SQL> select * from member_ where gr_id = 4;

no rows selected

SQL> select * from carr_ch where gr_id = 4;

no rows selected

я видел все эту задачу как либо та либо другая.
спасибо огромное за помощь!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работа с Триггерами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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