Использование оператора Merge внутри курсора - PullRequest
4 голосов
/ 01 декабря 2011

У нас есть требование заполнить основную таблицу, которая состоит из столбцов из набора из 20 различных таблиц.

Я написал хранимую процедуру для объединения некоторых таблиц, которые возвращают мне максимальное количество столбцов и помещают их в курсор.

Теперь. Я использую цикл for для перебора записей курсора, чтобы я мог вставить их в основную таблицу.

Как я могу использовать оператор слияния внутри курсора для цикла, чтобы я мог проверить, нужно ли мне обновить существующую строку или вставить новую строку в зависимости от того, существуют ли уже записи или нет.

Есть идеи, если мы можем использовать оператор слияния внутри курсора для цикла? Есть примеры?

1 Ответ

9 голосов
/ 01 декабря 2011

Вы можете сделать 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 читался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...