□ INSERT INTO employees_view (
employee_id, manager_id, first_name, last_name, t i t l e
) VALUES (
5 , 1 , ' J e f f ’ , ' Jones', ‘ CTO’
);
1 row created.
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE employee_id = 5;
EMPL0YEE_ID FIRST_NAME LAST_NAME SALARY
5 Jeff Jones
Создание таблиц, последовательностей, индексов и представлений 343
Столбец salary для новой строки таблицы employees имеет значение
NULL.
Создание представления с ограничением C H E C K O P T IO N
Можно указать, что операции DML над представлением должны удовлетворять
подзапросу, добавив к определению представления ограничение
WITH CHECK OPTION. Следующий оператор CREATE VIEW создает представление
cheap_products_view2, в котором имеется ограничение WITH
□ CHECK OPTION:
CREATE VIEW cheap_products_view2 AS
SELECT *
FROM products
WHERE price < 15
WITH CHECK OPTION CONSTRAINT cheap_products_view2_price;
В следующем примере показана попытка вставить строку с ценой товара
$19.50 с помощью представления cheap_products_view2. База данных выдает
сообщение об ошибке, потому что вставляемая строка не может быть
отобрана представлением:
□ INSERT INTO cheap_products_view2 (
product_id, product_type_id, name, price
) VALUES (
15, 1, ‘ Southern Front’ , 19.50
);
INSERT INTO cheap_products_view2 (
★
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
(ОШИБКА в строке 1: 0RA-01402: нарушение фразы WHERE представления с
WITH CHECK OPTION)
Создание представления с ограничением R EAD O N L Y
Можно создать представление только для чтения, добавив к нему ограничение
READ ONLY. Следующий оператор CREATE VIEW создает представление
с именем cheap_products_view3, у которого имеется ограничение READ
ONLY:
□ CREATE VIEW cheap_products_view3 AS
SELECT *
FROM products
WHERE PRICE < 15
WITH READ ONLY CONSTRAINT cheap_products_view3_read_only;
В следующем примере показана попытка вставить строку, используя
представление cheap_products_view3. База данных выдает сообщение об
ошибке, потому что представление является представлением только для
чтения и не допускает использования других операций DML:
□ INSERT INTO cheap_products_view3 (
product_id, product_type_id, name, price
) VALUES (
16, 1, ‘ Northern Front’ , 19.50
344 Глава 10
);
рroduct_id, product_type_id, name, price
ERROR at line 2:
ORA-42399: cannot perform a DML operation on a read-only view
(ORA-42399: невозможно выполнить DML операцию для представления только
для чтения)
Получение информации об определениях представлений
Информацию об определениях представлений можно получить, используя
команду DESCRIBE. В следующем примере используется команда DESCRIBE
для cheap_products_view3:
□ DESCRIBE cheap_products_view3
Name Null? Type
PRODUCT_ID NOT NULL NUMBER(38)
PRODUCT_TYPE_ID NUMBER(38)
NAME NOT NULL VARCHAR2(30)
DESCRIPTION ’ VARCHAR2(50)
PRICE NUMBER(5, 2)
Информацию о своих представлениях можно получить, задав запрос к
представлению user_views. В таблице 10.9 перечислены некоторые столбцы
в user_views.
Таблица 10.9. Некоторые столбцы в user_views
Столбец Тип Описание
view_name VARCHAR2(30) Имя представления.
t e x t_ le n g th NUMBER Число символов в подзапросе,
t e x t long Текст подзапроса представления.
Примечание Информацию о всех представлениях, к которым есть доступ, можно получить,
задав запрос к all_views.
Чтобы увидеть полностью определение представления, которое хранится
в столбце text, используйте команду SQI?Plus SET LONG, которая
устанавливает число отображаемых SQIfPlus символов при извлечении
столбцов LONG. Например, следующая команда устанавливает LONG на 200:
П SET LONG 200
Следующий пример отбирает из user_views столбцы view_name, text_
length и text:
□ SELECT view_name, text_length, text
FROM user_views
ORDER BY view_name;
Создание таблиц, последовательностей, индексов и представлений 345
VIEW_NAMETEXT_LENGTH
TEXT
CHEAP_PRODUCTS_VIEW 97
SELECT “PRODUCT_ID” , “PRODUCT_TYPE_ID” , “NAME” , “DESCRIPTION” , “PRICE"
FROM products
WHERE price < 15
CHEAP_PR0DUCTS_VIEW2 116
SELECT “PRODUCT_ID” , "PRODUCTTYPE_ID” , "NAME", “DESCRIPTION” , “PRICE”
FROM products
WHERE price < 15
WITH CHECK OPTION
CHEAP_PR0DUCTS_VIEW3 113
SELECT “PRODUCT_ID” , “PRODUCT_TYPE_ID” , “NAME” , “DESCRIPTION” , “PRICE”
FROM products
WHERE price < 15
WITH READ ONLY
EMPLOYEES_VIEW 75
SELECT employee_id, manager_id, first_name, last_name, t i t l e
FROM employees
Получение информации об ограничениях для представлений
К представлению можно добавить ограничения CHECK OPTION и READ ONLY.
Представление cheap_products_view2 содержит ограничение CHECK OPTION,
которое гарантирует, что цена товара меньше 15 долларов. Представление
cheap_products_view3 содержит ограничение READ 0LY, не позволяющее
модифицировать строки базовой таблицы.
Получить информацию об ограничениях для представлений можно из
user_constraints; например:
□ SELECT
constraint_name, constraint_type, status, deferrable, deferred