powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / MERGE для мутирующей таблицы
5 сообщений из 5, страница 1 из 1
MERGE для мутирующей таблицы
    #32185206
Boris A. Andreev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.
Ситуация следующая:
Есть мутирующая таблица.
Редактируем одну запись, в другую запись устанавливается какое-то значение.
Так вот видимо операторные тригеры (Statement) это реализующие не работают во время рабыты merge т.е.
предположим, что в Table1 2 записи. Тригеры работают так: при редактировании записи с id=1 добавляется третья.
После выполнения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
      MERGE INTO Table1 a1
       USING (SELECT * 
                FROM table2) a2 
       ON (a1.id = a2.id)
       WHEN MATCHED THEN UPDATE SET a1.value = a2.value
       WHEN NOT MATCHED THEN INSERT (a1.id, a1.value)
       VALUES (a1.id, a1.value);

в Table1 остается 2 записи.
А при выполнении простого запроса
Код: plaintext
1.
      UPDATE Table1 set value =  333 

Запись (та которая должна была добавиться) добавляется.
Может кто сталкивался??? Подскажите .. .. . .
...
Рейтинг: 0 / 0
MERGE для мутирующей таблицы
    #32186018
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Are you sure it is STATEMENT level trigger not firing? Any chance you have a ROW level trigger on a specific column (e.g. BEFORE INSERT OR UPDATE OF some-column ON some-table FOR EACH ROW)? If so, then you could be running into a bug 2473741: "Before Row trigger at column level on table does not get executed when running a merge statement resulting in update". Workaround is to remove OF some-column from trigger definition. If row level trigger will not fire, PL/SQL table you are, most likely, using to bypass mutating issue will stay empty and as a result statement level trigger fires but does nothing.

SY.
...
Рейтинг: 0 / 0
MERGE для мутирующей таблицы
    #32186050
Boris A. Andreev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация следующая:
описан массив.
в before statement level triger массив чистится,
в after row level triger массив заполняется,
а в after statement level triger организован цикл по массиву, внутри цикла происходит собственно говоря UPDATE. Именно этот тригер не работает, вернее даже не начинает работать...
...
Рейтинг: 0 / 0
MERGE для мутирующей таблицы
    #32186740
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I just tested it on 9.2 and it works OK:

Код: 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.
SQL> create or replace
   2     package pkg
   3       is
   4         recursion boolean := FALSE;
   5   end;
   6   /

Package created.

SQL> create table emp1 as select * from emp;

Table created.

SQL> delete emp1 where job='CLERK';

 4  rows deleted.

SQL> update emp1 set sal=sal+ 10000 ;

 10  rows updated.

SQL> create or replace
   2     trigger emp1_aut
   3       after update
   4       on emp1
   5       begin
   6         if NOT pkg.recursion
   7           then
   8             pkg.recursion := TRUE;
   9             update emp1 set sal=-sal;
  10         end if;
  11   end;
  12   /

Trigger created.

SQL> select * from emp;

EMPNO ENAME      JOB         MGR HIREDATE     SAL  COMM DEPTNO
 ----- ---------- --------- ----- --------- ------ ----- ------
 
  7369  SMITH      CLERK       7902   17 -DEC- 80      800             20 
  7499  ALLEN      SALESMAN    7698   20 -FEB- 81     1600     300       30 
  7521  WARD       SALESMAN    7698   22 -FEB- 81     1250     500       30 
  7566  JONES      MANAGER     7839   02 -APR- 81     2975             20 
  7654  MARTIN     SALESMAN    7698   28 -SEP- 81     1250    1400       30 
  7698  BLAKE      MANAGER     7839   01 -MAY- 81     2850             30 
  7782  CLARK      MANAGER     7839   09 -JUN- 81     2450             10 
  7788  SCOTT      ANALYST     7566   19 -APR- 87     3000             20 
  7839  KING       PRESIDENT        17 -NOV- 81     5000             10 
  7844  TURNER     SALESMAN    7698   08 -SEP- 81     1500       0       30 
  7876  ADAMS      CLERK       7788   23 -MAY- 87     1100             20 

EMPNO ENAME      JOB         MGR HIREDATE     SAL  COMM DEPTNO
 ----- ---------- --------- ----- --------- ------ ----- ------
 
  7900  JAMES      CLERK       7698   03 -DEC- 81      950             30 
  7902  FORD       ANALYST     7566   03 -DEC- 81     3000             20 
  7934  MILLER     CLERK       7782   23 -JAN- 82     1300             10 

 14  rows selected.

SQL> select * from emp1;

EMPNO ENAME      JOB         MGR HIREDATE     SAL  COMM DEPTNO
 ----- ---------- --------- ----- --------- ------ ----- ------
 
  7499  ALLEN      SALESMAN    7698   20 -FEB- 81    11600     300       30 
  7521  WARD       SALESMAN    7698   22 -FEB- 81    11250     500       30 
  7566  JONES      MANAGER     7839   02 -APR- 81    12975             20 
  7654  MARTIN     SALESMAN    7698   28 -SEP- 81    11250    1400       30 
  7698  BLAKE      MANAGER     7839   01 -MAY- 81    12850             30 
  7782  CLARK      MANAGER     7839   09 -JUN- 81    12450             10 
  7788  SCOTT      ANALYST     7566   19 -APR- 87    13000             20 
  7839  KING       PRESIDENT        17 -NOV- 81    15000             10 
  7844  TURNER     SALESMAN    7698   08 -SEP- 81    11500       0       30 
  7902  FORD       ANALYST     7566   03 -DEC- 81    13000             20 

 10  rows selected.

SQL> merge
   2     into emp1
   3     using emp
   4     on (emp1.empno = emp.empno)
   5     when matched then update set emp1.sal=emp.sal
   6     when not matched then insert (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
   7                            values(emp.EMPNO,emp.ENAME,emp.JOB,emp.MGR,emp.HIREDATE,
   8                                   emp.SAL,emp.COMM,emp.DEPTNO);

 14  rows merged.

SQL> select * from emp1;

EMPNO ENAME      JOB         MGR HIREDATE     SAL  COMM DEPTNO
 ----- ---------- --------- ----- --------- ------ ----- ------
 
  7934  MILLER     CLERK       7782   23 -JAN- 82   - 1300             10 
  7499  ALLEN      SALESMAN    7698   20 -FEB- 81   - 1600     300       30 
  7521  WARD       SALESMAN    7698   22 -FEB- 81   - 1250     500       30 
  7566  JONES      MANAGER     7839   02 -APR- 81   - 2975             20 
  7654  MARTIN     SALESMAN    7698   28 -SEP- 81   - 1250    1400       30 
  7698  BLAKE      MANAGER     7839   01 -MAY- 81   - 2850             30 
  7782  CLARK      MANAGER     7839   09 -JUN- 81   - 2450             10 
  7788  SCOTT      ANALYST     7566   19 -APR- 87   - 3000             20 
  7839  KING       PRESIDENT        17 -NOV- 81   - 5000             10 
  7844  TURNER     SALESMAN    7698   08 -SEP- 81   - 1500       0       30 
  7369  SMITH      CLERK       7902   17 -DEC- 80    - 800             20 

EMPNO ENAME      JOB         MGR HIREDATE     SAL  COMM DEPTNO
 ----- ---------- --------- ----- --------- ------ ----- ------
 
  7876  ADAMS      CLERK       7788   23 -MAY- 87   - 1100             20 
  7902  FORD       ANALYST     7566   03 -DEC- 81   - 3000             20 
  7900  JAMES      CLERK       7698   03 -DEC- 81    - 950             30 


SY
...
Рейтинг: 0 / 0
MERGE для мутирующей таблицы
    #32186979
Boris A. Andreev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Thanks!!!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / MERGE для мутирующей таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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