• Condition — условие связи двух таблиц.
Пример
Создадим следующую таблицу:
Удалим из таблицы строки, где OBJECT_TYPE = TABLE или INDEX.
Обновим данные в таблице T_OBJ на основе основного запроса.
Удалим из таблицы строки, где OBJECT_TYPE = TABLE или INDEX.
Только вставка
Только обновление
Пример 2
Разберем работу оператора MERGE.
Создадим таблицу PERSON1.
На основании PERSONобновим часть записей в PERSON и удалим часть из них для актуальности примера.
Выполним команду MERGE
Записи в PERSON будут обновлены и дополнены записями из PERSON1.
Пример 3
Очистим таблицу AUTO1.
Добавим четыре записи из таблицы AUTO.
Обновим данные в поле MARK.
Рисунок 218. Выбор данных из AUTO1
Обновим данные
Рисунок 219. Выбор данных из таблицы AUTO1
Выберем данные из таблицы AUTO1.
MERGE является DML-командой, командой управления данными.
Эту команду следует завершать командой COMMIT.
Вместо таблицы INTO можно указать запрос.
Пример
Как добавить или обновить некоторое одиночное значение с помощью MERGE?
Нет ничего проще, можно использовать запрос к таблице DUAL.
Пример
Контрольные вопросы и задания для самостоятельного выполнения
1. Повторите материалы данного шага.
2. Поясните работу оператора MERGE.
3. Обновите данные в таблице MAN1 на основе таблицы MAN с использованием MERGE.
4. Обновите данные в таблице CITY1 на основе таблицы CITY с использованием MERGE.
Шаг 83. Транзакции и блокировки
Для данного шага нам потребуется установить дополнительное программное обеспечение (ORACLEXE, PL SQL DEVELOPER). Подробнее о том, как устанавливать данные программы, описано в шаге 51 настоящей книги.
Данный шаг посвящен транзакционной модели и работе ORACLE SQL в многопользовательском режиме.
В ORACLE СУБД используется транзакционная модель.
Изменения в данных, выполненные с помощью операторов INSERT, UPDATE, MERGE, DELETE, необходимо зафиксировать с помощью COMMIT или UPDATE.
Но работа в команде, работа одновременно нескольких пользователей подразумевает возможность одновременного редактирования данных.
Пример для демонстрации работы в многопользовательском режиме.
Создадим таблицу MAN5.
Откроем две программы SQLDEVELOPER независимо друг от друга в двух разных окнах. Либо можно открыть новый SQL WORKSHEET, воспользовавшись кнопкой NEW SHARED SQL WORKSHEET.
Подключимся к пользователю SYS в обоих окнах, как указано в шаге 51.
Заполним новую таблицу данными.
Выполним следующие команды в одном окне SQLDEVELOPER.
Переключим на другое окно программы SQLDEVELOPER.
Напишем запрос:
Запрос вернул пустое множество, переключим окно SQLDEVELOPER.
Уже в этом окне напишем запрос.
Запрос вернул три строки.
Выполним команду COMMIT;
Переключимся на второе окно SQL.
Запрос вернул три строки.
Транзакция — неделимая последовательность из нескольких SQL-команд.
Пользователь делает изменения в своей транзакции, до выполнения команды СOMMIT транзакция не фиксирует изменения в общей базе.
Таким образом, пока изменения не были зафиксированы командой COMMIT, только первый пользователь мог видеть изменения данных, которые он сделал; остальные пользователи базы данных этих изменений не видели.
Команда COMMIT зафиксировала изменения, и они стали доступны другим пользователям базы данных.
Предположим, что пользователь 1 отредактировал данные в некоторой таблице, но не завершил операцию редактирования командой COMMIT;
Одновременно другой пользователь также отредактировал данные и выполнил команду COMMIT; получается, что у пользователя 1 теперь будут некорректные данные?
Для того чтобы избежать подобной коллизии, ORACLE использует механизм блокировок.
Продемонстрируем работу данного механизма.
В первом окне обновим данные следующим запросом:
Во втором окне так выполним соответствующую команду:
Это приводит к длительному зависанию программы и ошибке, данные в таблице не изменились.
Подобная ситуация произошла потому, что при выполнении команд обновления данных в первой сессии установлены блокировки на записи таблицы.
Для того чтобы избежать подобной ситуации, следует предварительно выполнить запрос со специальной директивой FOR UPDATE NO WAIT для таблицы, записи к которой следует обновить.
Читать дальше
Конец ознакомительного отрывка
Купить книгу