МАНИПУЛИРОВАНИЕ ДАННЫМИ Команды обработки данных и управления транзакциями Команда INSERT UPDATE DELETE COMMIT SAVEPOINT ROLLBACK Описание Добавляет новую строку в таблицу. Изменяет существующие строки таблицы. Удаляет строки из таблицы Делает все незафиксированные изменения постоянными. Позволяет произвести откат до определенной точки сохранения (savepoint). Отменяет все незафиксированные изменения данных. Вставка новых строк в таблицу: синтаксис • Вставка новых строк в таблицу производится с помощью команды INSERT INSERT INTO table [(column [, column...])] VALUES (value [, value...]); • Этот синтаксис позволяет вставлять только по одной строке Вставка новых строк в таблицу: пример • Вставка новой строки, содержащей значения для каждого из столбцов • Перечисление столбцов в предложении INSERT необязательно SQL> INSERT INTO s_dept 2 VALUES (11, 'Finance’, 2); 1 row created. • Значения указываются в стандартном порядке столбцов таблицы (в последовательности, используемой по умолчанию) • Символьные значения и даты заключаются в апострофы Вставка строк с неопределенными значениями Неявный метод: • Столбец опускается в списке столбцов SQL> INSERT INTO s_dept (id, name) 2 VALUES (12, 'MIS'); 1 row created. • Явный метод: • Ключевое слово NULL или пустая строка в списке VALUES (‘’) SQL> INSERT INTO S_dept 2 VALUES (13, 'Administration', NULL); 1 row created. Вставка специальных значений • Функция USER записывает текущее имя пользователя. • Функция SYSDATE записывает текущую дату и время. SQL> INSERT INTO s_emp (id, first_name, 2 last_name, userid, salary, start_date) 3 VALUES (26, 'Donna’, 4 'Smith’, USER, NULL, TO_DATE(SYSDATE)); 1 row created. Подтверждение вставки • Проверка факта вставки строки в таблицу SQL> SELECT id, last_name, first_name, 2 userid, start_date, salary 3 FROM s_emp 4 WHERE id = 26; ID LAST_NAME FIRST_NAME USERID START_DAT SALARY -- --------- ---------- -------------- -----26 Smith Donna SFCL26 Ol-JAN-96 Вставка конкретной даты и времени • Функция TO_DATE: – Замещает дату и время, используемые по умолчанию, конкретными значениями SQL> INSERT INTO s_emp (id, first_name, 2 last_name, userid, salary, start_date) 3 VALUES (26, 'Donna', 4 'Smith', USER, NULL, 5 TO_DATE('01-JAN-96 08:00', 6 'DD-MON-YY HH:MI')); 1 row created. • Значения по умолчанию: – для столетия - текущий век – для времени - полночь Вставка значений с помощью переменных подстановки • Интерактивный командный файл можно создать с помощью подставляемых параметров SQL*Plus SQL> INSERT INTO s_dept (id, name, 2 region_id) 3 VALUES (&department_id, ‘&department_name', 4 &region_id); Enter value for department_id: 61 Enter value for department_name: Accounting Enter value for region_id: 2 1 row created. Создание командного файла с удобным запросом данных у пользователя • Команда ACCEPT SQL*PIus запоминает введенное значение в переменной. • Команда PROMPT SQL*Plus позволяет выводить на экран текст, удобный для пользователя. ACCEPT department_id PROMPT ‘Please enter the department number: ' ACCEPT department_name PROMPT ‘Please enter the department_name: ’ ACCEPT region_id PROMPT ‘Please enter the region number: ' INSERT INTO s_dept (id, name, region_id) VALUES (&department_id, ‘&department_name’, &region_id); Копирование строк из другой таблицы • Команда INSERT должна включать подзапрос SQL> INSERT INTO history (id, last_name, salary, 2 title, start_date) 3 SELECT id, last_name, salary, 4 title, start_date 5 FROM s_emp 6 WHERE start_date < 'Ol-JAN-94'; 10 rows created. • Предложение VALUES не используется • Количество столбцов, указанных в предложении INSERT, должно совпадать с количеством столбцов в подзапросе Вставка строк: нарушение условия целостности SQL> insert into s_dept (id, name, region_id) 2 values (51, 'Education', 10); insert into s_dept (id, name, region_id) * ERROR at line 1: ORA-02291: integrity constraint (ANNA.S_DEPT_REGION_ID_FK) violated – parent key not found Так как отдела номер 10 в таблице регионов нет, выдается сообщение об ошибке Обновление строк в таблице синтаксис • Для обновления существующих строк используется команда UPDATE UPDATE table SET column = value [,column = value] [WHERE condition]; Обновление строк: примеры • Перевод сотрудника номер 2 в отдел 10 SQL> UPDATE s_emp 2 SET dept_id =10 3 WHERE id = 2; 1 row updated. • Перевод сотрудника номер 1 в отдел 32 и увеличение его зарплаты до 2550 SQL> UPDATE s_emp 2 SET dept_id = 32, salary = 2550 3 WHERE id = 1; 1 row updated. Обновление всех строк таблицы • Если предложение WHERE отсутствует, обновляются все строки таблицы SQL> UPDATE s_еmр 2 SET commission_pct = 10; 25 rows updated. Обновление строк: нарушение условия целостности SQL> UPDATE s_emp 2 SET dept_id = 60 3 WHERE dept_id = 10; ERROR at line 1: ORA-02291 : integrity constraint (USR.S_EMP_DEFT_ID_FK) violated - parent key not found Так как отдела номер 60 в таблице отделов нет, выдается сообщение об ошибке Удаление строк из таблицы: синтаксис • Для удаления строк используется команда DELETE DELETE [FROM] table [WHERE condition]; • Пример удаления данных о служащих, принятых на работу после 1 января 1996 г SQL> DELETE FROM s_emp 2 WHERE start_date > 3 TO_DATE('01.01.1996', 'DD.MM.YYYY'); 1 row deleted. Удаление строк: пример • Удаление всех строк таблицы путем исключения предложения WHERE SQL> DELETE FROM test; 25,000 rows deleted. • Проверка удаления SQL> SELECT * 2 FROM test ; no rows selected Удаление строк: нарушение условия целостности • При попытке удалить строку с первичным ключом, который одновременно является внешним ключом в другой таблице, выдается сообщение об ошибке в связи с нарушением ограничения. SQL> DELETE FROM S_dept 2 WHERE region_id = 1; ERROR at line 1: ORA-02292: integrity constraint (USR.S_EMP_DEPT_ID_FK) violated - child record found Транзакции базы данных • Содержат что-либо из следующего: – Команды DML, выполняющие единое согласованное изменение данных – Одна команда DDL – Одна команда DCL • Начинаются с выполнения первой исполняемой команды SQL • Заканчиваются одним из следующих событий: – Выполнение команды COMMIT или ROLLBACK – Выполнение команды DDL или DCL (автоматическая фиксация) – Ошибка, завершение сеанса работы или аварийный останов системы Преимущества COMMIT и ROLLBACK • Обеспечивают согласованность данных • Позволяют проверить изменения в данных прежде, чем сделать их постоянным • Логически группируют взаимосвязанные операции Управление транзакциями COMMIT INSERT Маркер точки сохранения А UPDATE Маркер точки сохранения B INSERT DELETE ROLLBACK ROLLBACK ROLLBACK до A ROLLBACK до B Неявная обработка транзакций • Автоматическая фиксация изменений (COMMIT) происходит следующих случаях: – Выполнение команды DDL (например, CREATE) – Выполнение команды DCL (например, GRANT) – Нормальный выход из SQL*Plus без явной посылки команды COMMIT или ROLLBACK • Автоматический откат (ROLLBACK) выполняется в случае аварийного прекращения сеанса работы в SQL*Plus или отказа системы Состояние данных перед выполнением команд COMMIT или ROLLBACK • Предыдущее состояние данных может быть восстановлено, т.к. изменения производятся в буфере базы данных • Текущий пользователь может просмотреть результаты своих операций DML с помощью команды SELECT • Другие пользователи не могут видеть результаты команд DML, выполняемых текущим пользователем • Изменяемые строки блокируются, и другие пользователи не могут обновлять их содержимое Состояние данных после выполнения команды COMMIT • • • • Измененные данные записываются в базу данных Предшествующее состояние данных теряется Все пользователи могут видеть результаты Измененные строки разблокируются, и другие пользователи получают доступ к ним для обработки данных • Все точки сохранения стираются Фиксация изменений в данных: пример • Создание нового отдела обучения. SQL> INSERT INTO s_dept (id, name, region_id) 2 VALUES (54, 'Education', 1); 1 row created. • Добавление данных, по крайней мере, об одном служащем SQL> UPDATE s_emp 2 SET dept_id = 54 3 WHERE id = 2; 1 row updated. • Фиксация изменений, SQL> COMMIT; Commit complete. Состояние данных после выполнения команды ROLLBACK • Отмена всех изменений • Данные возвращаются в прежнее состояние • Блокировка строк, над которыми выполнялись операции, отменяется SQL> DELETE FROM test; 25,000 rows deleted. SQL> ROLLBACK; Rollback, complete. Откат до маркера • С помощью команды SAVEPOINT можно создать в текущей транзакции маркеры для отката • Откат до такого маркера выполняется с помощью команды ROLLBACK TO SAVEPOINT SQL> UPDATE... SQL> SAVEPOINT update_done; Savepoint created. SQL> INSERT... SQL> ROLLBACK TO update_done; RolIback complete. Откат на уровне команды • Если ошибка возникла при выполнении одной конкретной команды DML, отменяются результаты только этой команды • Oracle использует неявную точку сохранения • Все прочие изменения сохраняются • Пользователь должен завершать транзакции явно командой COMMIT или ROLLBACK Заключение Команда INSERT UPDATE DELETE COMMIT SAVEPOINT ROLLBACK Описание Добавляет новую строку в таблицу. Изменяет существующие строки. Удаляет существующие строки. Делает все незафиксированные изменения постоянными. Позволяет произвести откат до определенной точки сохранения. Отменяет все незафиксированные изменения данных.