FROM user_constraints
WHERE table_name IN ( ‘ CHEAP_PR0DUCTS_VIEW2’ , ' CHEAP_PR0DUCTS_VIEW3’ );
CONSTRAINT_NAME С STATUS DEFERRABLE DEFERRED
CHEAP_PR0DUCTS_VIEW2_PRICE V ENABLED NOT DEFERRABLE IMMEDIATE
CHEAP_PR0DUCTS_VIEW3_READ_0NLY 0 ENABLED NOT DEFERRABLE IMMEDIATE
Значение constraint_type для CHEAP_PR0DUCTS_VIEW2_PRICE равно V, что в
соответствии с таблицей 10.3 соответствует ограничению CHECK OPTION.
Значение constraint_type для CHEAP_PR0DUCTS_VIEW3_READ_0NLY равно О, что
соответствует ограничению READ ONLY.
Создание и использование сложных представлений
Сложные представления содержат подзапрос, который:
■ выполняет выборку из нескольких таблиц;
346 Глава 10
■ группирует строки, используя фразы GROUP BY или DISTINCT;
■ содержит вызовы функций.
В следующем примере создается представление по имени products_
and_types_view, в подзапросе которого выполняется полное внешнее соединение
таблиц products и products_types с использованием синтаксиса
SQL/92:
□ CREATE VIEW products_and_types_view AS
SELECT p.product_id, p.name product_name, pt.name product_type_name, p.
price
FROM products p FULL OUTER JOIN product_types pt
USING (product_type_id)
ORDER BY p.product_id;
В следующем примере делается запрос к этому представлению:
□ SELECT *
FROM products_and_types_view;
ID PR0DUCT_NAME PR0DUCT_TY PRICE
1 Modern Science Book 19.95
2 Chemistry Book 30
3 Supernova Video 25.99
4 Tank War Video 13.95
5 Z Files Video 49.99
6 2412: The Return Video 14.95
7 Space Force 9 DVD 13.49
8 From Another Planet DVD 12.99
9 Classical Music CD 10.99
10 Pop 3 CD 15.99
11 Creative Yell CD 14.99
12 My Front Line 13.49
13 Western Front Book 13.5
14 Eastern Front Book 16.5
В следующем примере создается представление employees_salary_
grades_view, в подзапросе которого используется внутреннее соединение
для получения тарифных разрядов для сотрудников:
□ CREATE VIEW employees_salary_grades_view AS
SELECT e.first_name, e.last_name, e . t i t le , e.salary, sg.salary_grade_id
FROM employees e INNER JOIN salary_grades sg
ON e.salary BETWEEN sg.low_salary AND sg.high_salary
ORDER BY sg.salary_grade_id;
В следующем примере выполняется запрос к employees_salary_grades_
view:
□ SELECT *
FROM employees_salary_grades_view;
Создание таблиц, последовательностей, индексов и представлений 347
FIRSTJIAME LAST_NAME TITLE SALARY SALARY_GRADE_ID
Fred
Susan
Ron
James
Hobbs Salesperson 150000
Jones Salesperson 500000
Johnson Sales Manager 600000
Smith CEO 800000
23
4
В следующем примере создается представление product_average_view,
подзапрос которого использует
■ Фразу WHERE для отбора из таблицы products строк, цены которых ниже
15 долларов.
■ Фразу GROUP BY для группировки оставшихся строк по столбцу
product_type_id.
■ Фразу HAVING для отбора групп строк, для которых средняя цена больше
13 долларов.
□ CREATE VIEW product_average_view AS
SELECT product_type_id, AVG(price) average_price
FROM products
WHERE price < 15
GROUP BY product_type_id
HAVING AVG(price) > 13
ORDER BY product_type_id;
В следующем примере выполняется запрос к product_average_view:
□ SELECT *
FROM product_average_view;
PR0DUCT_TYPE_ID AVERAGE_PRICE
Модификация представления
Можно полностью заменить представление, используя оператор CREATE OR
REPLACE VIEW. Следующий оператор использует CREATE OR REPLACE VIEW для
замены product_average_view:
□ CREATE OR REPLACE VIEW product_average_view AS
SELECT product_type_id, AVG(price) average_price
FROM products
WHERE price < 12
GROUP BY product_type_id
HAVING AVG(price) > 11
ORDER BY product_type_id;
Вы можете изменить ограничения для представления с использованием
ALTER VIEW. В следующем примере используется ALTER VIEW для удаления
1 13.5
2 14.45
3 13.24
13.49
348 Глава 10
из представления cheap_products_view2 ограничения cheap_products_
view2_price:
□ ALTER VIEW cheap_products_view2
DROP CONSTRAINT cheap_products_view2_price;
Удаление представления
Для удаления представления используется оператор DROP VIEW. В следующем
примере удаляется представление cheap_products_view2 :
□ DROP VIEW cheap_products_view2;
На этом мы завершим обсуждение представлений. В следующем разделе
вы узнаете об архивах ретроспективных данных.
Архивы ретроспективных данных
Архивы ретроспективных данных, являющиеся нововведением в Oracle
l lg , хранят изменения, выполненные в таблице в течение некоторого
промежутка времени, и- предоставляют для вас полный аудиторский след.
Как только вы создадите ретроспективный архив и добавите к нему таблицу,
вы сможете:
■ просматривать строки в том виде, как они выглядели для заданной
метки даты-времени;
■ просматривать строки в том виде, как они выглядели между двумя
метками даты-времени.
Ретроспективный архив создаётся при помощи выражения CREATE
FLASHBACK ARCHIVE. В следующем примере выполняется подключение под
пользователем system и создание ретроспективного архива с именем test_
archive:
□ CONNECT system/manager
CREATE FLASHBACK ARCHIVE test_archive
TABLESPACE example
QUOTA 1 M
RETENTION 1 DAY;