Вы можете сделать MERGE
, выбрав данные курсора из DUAL
.Например,
Создайте таблицу источника и назначения с некоторыми данными
SQL> create table src ( col1 number, col2 varchar2(10) );
Table created.
SQL> create table dest( col1 number, col2 varchar2(10) );
Table created.
SQL> insert into src values( 1, 'A' );
1 row created.
SQL> insert into src values( 2, 'B' );
1 row created.
SQL> insert into dest values( 1, 'C' );
1 row created.
SQL> commit;
Commit complete.
Запустите объединение
SQL> ed
Wrote file afiedt.buf
1 begin
2 for x in (select * from src)
3 loop
4 merge into dest
5 using( select x.col1 col1, x.col2 col2
6 from dual ) src
7 on( src.col1 = dest.col1 )
8 when matched then
9 update set col2 = src.col2
10 when not matched then
11 insert( col1, col2 )
12 values( src.col1, src.col2 );
13 end loop;
14* end;
SQL> /
PL/SQL procedure successfully completed.
и убедитесь, что объединение сделало то, что мы хотели.Строка 1 была обновлена, а строка 2 вставлена.
SQL> select * from dest;
COL1 COL2
---------- ----------
1 A
2 B
Однако структурировать код таким образом обычно не имеет особого смысла.Как правило, лучше поместить запрос, который будет использоваться для непосредственного открытия курсора, в оператор MERGE, чтобы вместо выбора одной строки данных из DUAL
вы выбирали все данные, из которых хотите объединитьвсе таблицы, из которых вы пытаетесь объединить данные.Конечно, может иметь смысл создать для этого запроса представление, которое может запрашивать оператор MERGE
, чтобы оператор MERGE
читался.