Лекция: Команда merge: реализация

На первый взгляд эта команда представляется хитрым решением кажущейся простой проблемы. Давайте рассмотрим пример, как можно было бы реализовать добавление данных к существующим строкам таблицы MOVIES, используя оператор merge, показанный в следующем блоке кода:

SQL> merge into movies Ml

2 usiig movies M2 on (M2.movie_name = Ml.movie_name

3 and Ml.movie_name = 'GONE WITH THE WIND’)

4 wnen matcned then update set Ml.showtime = '7:30 PM'

5 when not matched then insert (Ml.movie^name, Ml.showtime]

6 values ('GONE WITH THE WIND’, '7:30 PM');

1 row merged.

SQL> select * from movies;

MOVIE_NAME SHOWTIME

GONE WITH THE WIfoD 7:30 PM

Изучим приведенный выше блок кода более подробно. В первой строке Oracle получает указание сливать строки в таблице MOVIES. Во второй строке задается правило проверки совпадения строк с использованием копии таблицы MOVIES. По сути дела, мы подсказываем Oracle, что для определения того, существует ли уже в таблице запись о фильме «Gone With The Wind», следует использовать содержимое второй копии таблицы MOVIES. Если это так (то есть запись существует), мы желаем, чтобы Oracle изменила время показа на 7:30 РМ. А если нет, наше указание сводится к тому, чтобы Oracle добавила новую запись для этого фильма с правильным временем показа. Обратите также внимание, что для избежания неоднозначности мы всюду, где это необходимо, используем псевдонимы таблиц. А теперь давайте посмотрим, что произойдет, если мы захотим добавить в таблицу MOVIES данные о фильме, отсутствующем в таблице:

$QL> merge into movies Ml

2 using movies M2 on (M2.movie_name = Ml.movie_name

3 and M2.movie_name = 'LAWRENCE OF ARABIA’)

4 when matched then update set Ml.showtime = '9:00 PM'

5 when not matched then insert (Ml.movie_name, Ml.showtime)

6 values ('LAWRENCE OF ARABIA','9:00 PM');

1 row merged.

SQL> select — from movies;

MOVIE_NAME SHOWTIME

GOME WITH THE WIND 7:30 PM

LAWRENCE OF ARABIA 9:00 PM

В этом блоке кода ничего не изменилось по сравнению с предыдущим примером, за исключением того, что мы хотели с помощью Oracle провести проверку записи для фильма «Lawrence of Arabia». Поскольку запись для этого фильма отсутствует, Oracle использует операцию insert, которая специфицирована нами во фразе when no matched для добавления новых записей в таблиц MOVIES.

СоветБыло бы здорово, если бы команда merge позволяла использовать фразу using как необязательную, что позволило бы упростить вид нашей команды для ситуаций, когда мы желаем работать только с одной таблицей.

еще рефераты
Еще работы по истории