Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / merge и seq.currval / 14 сообщений из 14, страница 1 из 1
21.11.2016, 14:44
    #39351111
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
Всем привет. Подскажите, пожалуйста, какой нибудь еврейский метод аудита currval для сиквенса, используемого в merge:
MERGE INTO tbl1
USING ( select * from tbl2) t
ON (tbl1.n = t.n)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT (...)
VALUES (seq.nextval,...);
На ум приходит триггер for each row и разбивка merge на отдельные update и insert, но что - то подсказывает, эта идея некошерная
...
Рейтинг: 0 / 0
21.11.2016, 17:34
    #39351294
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
israelshamir,

Нафиг?
...
Рейтинг: 0 / 0
21.11.2016, 18:18
    #39351344
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
israelshamirВсем привет. Подскажите, пожалуйста, какой нибудь еврейский метод аудита currval для сиквенса, используемого в merge:
MERGE INTO tbl1
USING ( select * from tbl2) t
ON (tbl1.n = t.n)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT (...)
VALUES (seq.nextval,...);
На ум приходит триггер for each row и разбивка merge на отдельные update и insert, но что - то подсказывает, эта идея некошерная
а таки чисто спросите у того сиквенса его currval до/после того merge
...
Рейтинг: 0 / 0
21.11.2016, 19:08
    #39351393
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
orawishisraelshamirВсем привет. Подскажите, пожалуйста, какой нибудь еврейский метод аудита currval для сиквенса, используемого в merge:
MERGE INTO tbl1
USING ( select * from tbl2) t
ON (tbl1.n = t.n)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT (...)
VALUES (seq.nextval,...);
На ум приходит триггер for each row и разбивка merge на отдельные update и insert, но что - то подсказывает, эта идея некошерная
а таки чисто спросите у того сиквенса его currval до/после того merge

не ожидал что мерже палит номера даже если инсертов не было
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> MERGE INTO t
  2  USING ( select 1 id from dual) tt
  3  ON (1 = 1)
  4  WHEN MATCHED THEN UPDATE SET n='u'
  5  WHEN NOT MATCHED THEN INSERT (id,n) VALUES (s.nextval,'i')
  6  /

4 rows merged.

SQL> select s.currval from dual;

   CURRVAL
----------
       124




.....
stax
...
Рейтинг: 0 / 0
21.11.2016, 19:10
    #39351396
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
israelshamirВсем привет. Подскажите, пожалуйста, какой нибудь еврейский метод аудита currval для сиквенса, используемого в merge:
MERGE INTO tbl1
USING ( select * from tbl2) t
ON (tbl1.n = t.n)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT (...)
VALUES (seq.nextval,...);
На ум приходит триггер for each row и разбивка merge на отдельные update и insert, но что - то подсказывает, эта идея некошерная

не совсем понял
в чем проблема?


.....
stax
...
Рейтинг: 0 / 0
21.11.2016, 19:37
    #39351422
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
stax..,

мне надо получить все значения сиквенса, которые были сгенерированы этим мержем в этом все дело. не хотелось бы разбивать merge на update и insert и в цикле получать currval для каждой вставленной записи.
...
Рейтинг: 0 / 0
21.11.2016, 19:51
    #39351431
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
israelshamirstax..,

мне надо получить все значения сиквенса, которые были сгенерированы этим мержем в этом все дело. не хотелось бы разбивать merge на update и insert и в цикле получать currval для каждой вставленной записи.
а как Вы их можете получить
допустим было 4 изменения 2 удаления и три инсерта
как узнаете что было именно 3 инсерта (без привязки к currval)?

ps
merge скользкий оператор

.....
stax
...
Рейтинг: 0 / 0
21.11.2016, 19:54
    #39351432
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
israelshamirмне надо получить все значения сиквенса, которые были сгенерированы этим мержем в этом все дело

Число значений сиквенса, которые были сгенерированы мержем = SQL%ROWCOUNT:

Код: 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.
SQL> create sequence s1
  2  /

Sequence created.

SQL> create table emp1
  2    as
  3      select  empno,
  4              ename
  5        from  emp
  6        where deptno = 10
  7  /

Table created.

SQL> merge
  2    into emp1 t
  3    using emp s
  4    on (t.empno = s.empno)
  5    when matched
  6      then
  7        update
  8           set ename = s.ename
  9    when not matched
 10      then
 11        insert
 12          values(
 13                 s1.nextval,
 14                 s.ename
 15                )
 16  /

14 rows merged.

SQL> select  s1.currval
  2    from  dual
  3  /

   CURRVAL
----------
        14

SQL> 



SY.
...
Рейтинг: 0 / 0
21.11.2016, 19:57
    #39351434
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
israelshamirstax..,

мне надо получить все значения сиквенса, которые были сгенерированы этим мержем в этом все дело. не хотелось бы разбивать merge на update и insert и в цикле получать currval для каждой вставленной записи.
запоминать куррвал в триггере он инсерт в коллекцию или в тмр табличку

.....
stax
...
Рейтинг: 0 / 0
21.11.2016, 20:05
    #39351437
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
SY,

Особенно все замечательно будет выглядеть в случае распараллеливания этого хозяйства, интереснее всего получается с разными DOP...



Regards

Maxim
...
Рейтинг: 0 / 0
21.11.2016, 20:15
    #39351446
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
SYisraelshamirмне надо получить все значения сиквенса, которые были сгенерированы этим мержем в этом все дело

Число значений сиквенса, которые были сгенерированы мержем = SQL%ROWCOUNT:

Код: 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.
SQL> create sequence s1
  2  /

Sequence created.

SQL> create table emp1
  2    as
  3      select  empno,
  4              ename
  5        from  emp
  6        where deptno = 10
  7  /

Table created.

SQL> merge
  2    into emp1 t
  3    using emp s
  4    on (t.empno = s.empno)
  5    when matched
  6      then
  7        update
  8           set ename = s.ename
  9    when not matched
 10      then
 11        insert
 12          values(
 13                 s1.nextval,
 14                 s.ename
 15                )
 16  /

14 rows merged.

SQL> select  s1.currval
  2    from  dual
  3  /

   CURRVAL
----------
        14

SQL> 



SY.
1) нужны те которые сгенерированы для вставки
2) в паралельных тоже могут палить номера

.....
stax
...
Рейтинг: 0 / 0
21.11.2016, 20:45
    #39351468
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
stax..1) нужны те которые сгенерированы для вставки
2) в паралельных тоже могут палить номера


Или тригер на insert, или UDF:

Код: 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.
SQL> set serveroutput on
SQL> create or replace
  2    function echo(
  3                  p_val number
  4                 )
  5      return number
  6      is
  7      begin
  8          dbms_output.put_line(p_val); -- change to logging
  9          return p_val;
 10  end;
 11  /

Function created.

SQL> merge
  2    into emp1 t
  3    using emp s
  4    on (t.empno = s.empno)
  5    when matched
  6      then
  7        update
  8           set ename = s.ename
  9    when not matched
 10      then
 11        insert
 12          values(
 13                 echo(s1.nextval),
 14                 s.ename
 15                )
 16  /
32
33
34
35
36
37
38
39
40
41
42

14 rows merged.

SQL> 



SY.
...
Рейтинг: 0 / 0
21.11.2016, 21:14
    #39351475
israelshamir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
Всем большое спасибо за помощь! Буду использовать UDF.
...
Рейтинг: 0 / 0
22.11.2016, 15:37
    #39351941
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge и seq.currval
israelshamirВсем большое спасибо за помощь! Буду использовать UDF.
я б спрятал nextval в тело ф-ции (без параметров)
тогда matched не будет палить номера

ps
правда есть нюанс с многократным использованием nextval

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


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