demo@10g> Insert into department (department_id,name,location_id)
values(77,'Teaching',null);
1 строка создана.
Напомним здесь, что при создании таблицы DEPARTMENT столбец location_id был объявлен foreign key с допущением null значений. Если бы вставляли новую строку в таблицу EMPLOYEE, мы не смогли бы вставить ее с null значением в столбце внешнего ключа department_id, так как при создании таблицы EMPLOYEE столбцу department_id было задано ограничение not null.
Вернем таблицу DEPARTMENT к прежнему состоянию:
demo@10g> rollback;
Откат завершен.
Повторим предыдущую команду немного в другом варианте:
demo@10g> Insert into department values(77,'Teaching',null);
1 строка создана.
Если вставляются все столбцы, указывать после названия таблицы столбцы необязательно.
Повторим откат:
demo@10g> rollback;
Откат завершен.
Выполним вставку только в отдельные столбцы:
demo@10g> Insert into department(department_id,name) values(77,'Teaching');
1 строка создана.
При вставке не всех столбцов их названия надо приводить после названия таблицы.
Повторим откат:
demo@10g> rollback;
Откат завершен.
Рассмотрим варианты вставки даты. Приведем структуру таблицы SALES_ORDER:
demo@10g> desc sales_order
Имя Пусто? Тип
------------------------- -------- -------------
ORDER_ID NOT NULL NUMBER(4)
ORDER_DATE DATE
CUSTOMER_ID NUMBER(6)
SHIP_DATE DATE
TOTAL NUMBER(8,2)
Посмотрим формат и language даты в нашем сеансе (см. раздел II.3.2):
demo@10g> select * from nls_session_parameters
where parameter in ('NLS_LANGUAGE','NLS_DATE_FORMAT');
В соответствии с этим форматом и выполним вставку:
demo@10g> insert into sales_order values(900,'21.07.89',208,'23.07.89',2345);
1 строка создана.
Выполним откат:
demo@10g> rollback;
Откат завершен.
Воспользуемся при вставке даты функцией to_date():
demo@10g> create sequence DEPARTMENTseq start with 60;
Последовательность создана.
Q4_3 Используем последовательность для генерации значений столбца department_id:
demo@10g> insert into department values(departmentseq.nextval,'training',122);
1 строка создана.
demo@10g> select * from department where name='training';
DEPARTMENT_ID NAME LOCATION_ID
------------- -------------- -----------
61 training 122
demo@10g> rollback;
Откат завершен.
Q4_4 Для вставки копированием с использованием запроса создадим таблицу S_GRADE, которая не будет иметь столбец – PRIMARY KEY:
demo@10g>create table S_GRADE as select * from SALARY_GRADE;
demo@10g>select * from S_GRADE;
demo@10g> insert into s_grade (select * from S_GRADE);
demo@10g>select * from S_GRADE;
При наличии столбца – primary key Oracle не допустил бы вставку повторяющихся по primary key строк. Теперь удалим созданную таблицу S_GRADE:
demo@10g> drop table S_GRADE;
Таблица удалена.
Q4_5 Вставка одной строки с использованием запроса:
demo@10g> insert into (select * from DEPARTMENT)
values(90,'teaching',122);
1 строка создана.
demo@10g> rollback;
Откат завершен.
Q4_6 Иногда требуется обеспечить ввод определенных значений столбца, не допуская другие значения для ввода. Такой ввод возможен с использованием WITH CHECK OPTION
demo@10g> insert into (select * from DEPARTMENT
where location_id = 122 with check option)
values(90,'teaching',50);
insert into (select * from DEPARTMENT
*
ошибка в строке 1:
ORA-01402: представление WITH CHECK OPTION не соответствует фразе WHERE
Ошибка зарегистрирована, так как в опции with check option указано допустимое для ввода значение location_id = 122, а вводимое значение 50.
demo@10g> insert into (select * from DEPARTMENT
where location_id = 122 with check option)
values(90,'teaching',122);
1 строка создана.
demo@10g> rollback;
Откат завершен.
Q4_7 Изменение строк таблицы командой UPDATE
Создадим еще раз таблицу S_GRADE
demo@10g>create table S_GRADE as select * from SALARY_GRADE;
Таблица создана.
demo@10g>select * from S_GRADE;
Изменим в таблице S_GRADE значений столбца lower_bound, установив в этом столбце значения из столбца upper_bound таблицы SALARY_GRADE
demo@10g> update S_GRADE set lower_bound=(select upper_bound from
SALARY_GRADE sg where sg.grade_id=S_GRADE.grade_id);
5 строк обновлено.
demo@10g>select * from S_GRADE;
demo@10g> rollback;
Откат завершен.
Q4_8 Выполним простое изменение строки таблицы DEPARTMENT
demo@10g> update DEPARTMENT
set name='TEACHING' where department_id=12;
1 строка обновлена.
demo@10g> rollback;
Откат завершен.
Q4_9 Изменить таблицу EMPLOYEE - перевести служащих в должности «CLERK» на должность «SALESPERSON» и при этом установить им 75% средних зарплаты и коммерческих сотрудников, уже работавших в должности «SALESPERSON»
demo@10g> update EMPLOYEE e set job_id = (select job_id from job where function =