Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в триггере [b]втихую[/b] отменить вставку строки (v.2) / 3 сообщений из 3, страница 1 из 1
19.05.2003, 23:11
    #32163506
vskv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в триггере [b]втихую[/b] отменить вставку строки (v.2)
Почитал /topic/32357 и задался вопросом -- а как сделать, чтобы строка не добавилась, но приложение об этом не узнало? \r
Т.е. делать raise exception не годится... Или это совсем уж против правил и посему нужно очень сильно извратиться???
...
Рейтинг: 0 / 0
19.05.2003, 23:53
    #32163512
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в триггере [b]втихую[/b] отменить вставку строки (v.2)
Piece of cake:

Код: 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.
SQL> CREATE TABLE CAN_NOT_INSERT(
   2                               X NUMBER
   3                              )
   4   /

Table created.

SQL> CREATE OR REPLACE
   2     PACKAGE GLOBAL
   3       IS
   4         TYPE ROWID_TABLE_TYPE IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
   5         ROWID_TBL ROWID_TABLE_TYPE;
   6   END GLOBAL;
   7   /

Package created.

SQL> CREATE OR REPLACE
   2     TRIGGER CAN_NOT_INSERT_BIS
   3       BEFORE INSERT
   4       ON CAN_NOT_INSERT
   5       BEGIN
   6           GLOBAL.ROWID_TBL.DELETE;
   7   END CAN_NOT_INSERT_BIS;
   8   /

Trigger created.

SQL> CREATE OR REPLACE
   2     TRIGGER CAN_NOT_INSERT_AIR
   3       AFTER INSERT
   4       ON CAN_NOT_INSERT
   5       FOR EACH ROW
   6       BEGIN
   7           GLOBAL.ROWID_TBL(NVL(GLOBAL.ROWID_TBL.LAST, 0 ) +  1 ) := :NEW.ROWID;
   8   END CAN_NOT_INSERT_AIR;
   9   /

Trigger created.

SQL> CREATE OR REPLACE
   2     TRIGGER CAN_NOT_INSERT_AIS
   3       AFTER INSERT
   4       ON CAN_NOT_INSERT
   5       BEGIN
   6           FORALL I IN  1 ..GLOBAL.ROWID_TBL.LAST
   7             DELETE CAN_NOT_INSERT
   8               WHERE ROWID = GLOBAL.ROWID_TBL(I);
   9   END CAN_NOT_INSERT_AIS;
  10   /

Trigger created.


And a test:

Код: 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.
SQL> INSERT
   2     INTO CAN_NOT_INSERT
   3     VALUES(
   4             1 
   5           )
   6   /

 1  row created.

SQL> SELECT  *
   2     FROM  CAN_NOT_INSERT
   3   /

no rows selected

SQL> INSERT
   2     INTO CAN_NOT_INSERT
   3     SELECT  ROWNUM
   4       FROM USER_OBJECTS
   5   /

 83  rows created.

SQL> SELECT  *
   2     FROM  CAN_NOT_INSERT
   3   /

no rows selected


SY
...
Рейтинг: 0 / 0
20.05.2003, 01:26
    #32163527
vskv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в триггере [b]втихую[/b] отменить вставку строки (v.2)
Да....
О смеси after insert на statement и each row я как-то не подумал. Меня всё на job тянуло. А тут так изящно...

Thanks a lot.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как в триггере [b]втихую[/b] отменить вставку строки (v.2) / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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