powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Доп. действия во время MERGE
9 сообщений из 34, страница 2 из 2
Доп. действия во время MERGE
    #40102825
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я хочу вот так сделать, так срабатывает по 1 разу:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
begin
  merge into tmp_a1 d
  using (select 11 a1, 'aaa' a2, 'mylog' log1 from DUAL) s
  on (s.a1 = d.a1)
  WHEN MATCHED THEN
      UPDATE SET
         d.a2 = TestINS(s.a2, s.a1, s.log1);
  if SQL%NOTFOUND then
    merge into tmp_a1 d
    using (select 11 a1, 'aaa' a2, 'mylog' log1 from DUAL) s
    on (s.a1 = d.a1)
    WHEN NOT MATCHED THEN
        INSERT
          (d.a1,d.a2)
        VALUES
          (s.a1, TestINS(s.a2, s.a1, s.log1));
  end if;
end;


только вот не хочется повторять селект, который в USING.
Как бы его описать в одном месте, а потом сослаться на него в обоих мержах?

Вот так не прокатывает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  cursor cur is 
    select 11 a1, 'aaa' a2, 'mylog' log1 from DUAL;
begin
  merge into tmp_a1 d
  using (select * from table(cur)) s
  on (s.a1 = d.a1)
  WHEN MATCHED THEN
      UPDATE SET
         d.a2 = TestINS(s.a2, s.a1, s.log1);
  if SQL%NOTFOUND then
    merge into tmp_a1 d
    using (select * from table(cur))) s
    on (s.a1 = d.a1)
    WHEN NOT MATCHED THEN
        INSERT
          (d.a1,d.a2)
        VALUES
          (s.a1, TestINS(s.a2, s.a1, s.log1));
  end if;
end;


в ошибке оракла говорится, что он не видит cur в using
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102842
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WITH то тут никак не применить или как то можно?
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102852
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter
WITH то тут никак не применить или как то можно?


А зачем разбивать на два MERGE?

SY.
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102853
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
verter
WITH то тут никак не применить или как то можно?


А зачем разбивать на два MERGE?

SY.


чтобы в одном вызывать функцию на случай апдейта, а в другом вызывать функцию на случай инсёрта.
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102855
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter

чтобы в одном вызывать функцию на случай апдейта, а в другом вызывать функцию на случай инсёрта.


???

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  merge into tmp_a1 d
  using (select 11 a1, 'aaa' a2, 'mylog' log1 from DUAL) s
  on (s.a1 = d.a1)
  WHEN MATCHED THEN
      UPDATE SET
         d.a2 = TestINS(s.a2, s.a1, s.log1);
  WHEN NOT MATCHED THEN
      INSERT
        (d.a1,d.a2)
      VALUES
        (s.a1, TestINS(s.a2, s.a1, s.log1));



SY.
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102857
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
verter

чтобы в одном вызывать функцию на случай апдейта, а в другом вызывать функцию на случай инсёрта.


???

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  merge into tmp_a1 d
  using (select 11 a1, 'aaa' a2, 'mylog' log1 from DUAL) s
  on (s.a1 = d.a1)
  WHEN MATCHED THEN
      UPDATE SET
         d.a2 = TestINS(s.a2, s.a1, s.log1);
  WHEN NOT MATCHED THEN
      INSERT
        (d.a1,d.a2)
      VALUES
        (s.a1, TestINS(s.a2, s.a1, s.log1));



SY.


Вы просто не прочитали всю ветку выше.
Если делать один MERGE, то функция TestINS() будет вызвана дважды несмотря на то, что при исполнении мержа выполняется либо блок на случай апдейта дибо блок на случай инсёрта.
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102868
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter

Вы просто не прочитали всю ветку выше.
Если делать один MERGE, то функция TestINS() будет вызвана дважды несмотря на то, что при исполнении мержа выполняется либо блок на случай апдейта дибо блок на случай инсёрта.


Это с какого перепугу?

Код: plsql
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.
SQL> drop table tmp_a1 purge
  2  /

Table dropped.

SQL> create table tmp_a1(
  2                      a1 number,
  3                      a2 varchar2(30),
  4                      log1 varchar2(30)
  5                     )
  6  /

Table created.

SQL> create or replace
  2    function testins(
  3                     p_a2 varchar2,
  4                     p_a1 number,
  5                     p_log1 varchar2
  6                    )
  7      return varchar2
  8      is
  9      begin
 10          dbms_output.put_line(p_log1);
 11          return p_log1;
 12  end;
 13  /

Function created.

SQL> set serveroutput on
SQL> -- update only
SQL> merge
  2    into tmp_a1 d
  3    using (
  4           select 11 a1, 'aaa' a2, 'update' log1 from dual
  5          ) s
  6    on (s.a1 = d.a1)
  7    when matched
  8      then
  9        update
 10           set d.a2 = testins(s.a2,s.a1,s.log1)
 11    when not matched
 12      then
 13        insert(d.a1,d.a2)
 14        values(s.a1,testins(s.a2,s.a1,s.log1))
 15  /
update

1 row merged.

SQL> -- insert only
SQL> merge
  2    into tmp_a1 d
  3    using (
  4           select 12 a1, 'bbb' a2, 'insert' log1 from dual
  5          ) s
  6    on (s.a1 = d.a1)
  7    when matched
  8      then
  9        update
 10           set d.a2 = testins(s.a2,s.a1,s.log1)
 11    when not matched
 12      then
 13        insert(d.a1,d.a2)
 14        values(s.a1,testins(s.a2,s.a1,s.log1))
 15  /
insert

1 row merged.

SQL> -- insert and update
SQL> merge
  2    into tmp_a1 d
  3    using (
  4           select 12 a1, 'ccc' a2, 'update' log1 from dual union all
  5           select 13 a1, 'ddd' a2, 'insert' log1 from dual
  6          ) s
  7    on (s.a1 = d.a1)
  8    when matched
  9      then
 10        update
 11           set d.a2 = testins(s.a2,s.a1,s.log1)
 12    when not matched
 13      then
 14        insert(d.a1,d.a2)
 15        values(s.a1,testins(s.a2,s.a1,s.log1))
 16  /
update
insert

2 rows merged.

SQL>



SY.
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102869
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
verter

Вы просто не прочитали всю ветку выше.
Если делать один MERGE, то функция TestINS() будет вызвана дважды несмотря на то, что при исполнении мержа выполняется либо блок на случай апдейта дибо блок на случай инсёрта.


Это с какого перепугу?

SY.


Вы смотрите кол-во строк, которое отмержилось, а не кол-во вызовов функции testins().
...
Рейтинг: 0 / 0
Доп. действия во время MERGE
    #40102871
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter

Вы смотрите кол-во строк, которое отмержилось, а не кол-во вызовов функции testins().


Посмотри на ф-цию. Каждое выполнение выплевывает DBMS_OUTPUT.PUT_LINE('INSERT')/DBMS_OUTPUT.PUT_LINE('UPDATE').

SY.
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Доп. действия во время MERGE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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