Используемый для этого синтаксис выглядит следующим образом: ALTER TABLE имя_таблицы ADD имя_нового_столбца тип данных [NOT NULL]

4. Дополнительные средства языка SQL СУБД Oracle
4.1. Операторы объединения
Помимо традиционного соединения таблиц, используемого в многотабличных запросах, существует ряд альтернативных типов объединений. Они применяются в разных ситуациях например, когда нужно комбинировать содержимое многих таблиц, имеющих похожие структуры, или сравнивать записи из разных таблиц, чтобы узнать, какие записи присутствуют в обеих таблицах или только в одной из них.
Все это можно делать с помощью операторов объединения (joining operators), связывая ими два оператора SELECT. Существует четыре различных оператора объединения, описанных в табл. 4.1. На рис. 4.1 графически показано, что получается в результате их применения.
Чтобы увидеть работу операторов объединения на примерах, имеющих практическое значение, следует создать новую таблицу и ввести в нее несколько записей, используя приведенные ниже команды.

Таблица 4.1
Операторы объединения
Оператор объединения
Получаемые результаты

UNION
Все строки из обоих операторов SELECT; повторяющиеся значения удаляются

UNION ALL
Все строки из обоих операторов SELECT; повторяющиеся значения показываются

INTERSECT
Строки, которые возвращены и первым, и вторым оператором SELECT

MINUS
Строки, которые возвращены первым оператором SELECT, исключая те, которые возвращены вторым оператором


13 EMBED PBrush 1415
Рис. 4.1. Результаты операций объединения
CREATE TABLE purchase_archive (
product_name VARCHAR2 (25) ,
salesperson VARCHAR2(3),
purchase_date DATE,
quantity NUMBER (4, 2)
) ;
IN
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
Оператор UNION предназначен для объединения данных из многих таблиц в один список. В отличие от операции соединения, предусмотренной в реляционной алгебре и использовавшейся ранее, этот оператор применяется в ситуациях, когда структуры двух таблиц похожи или идентичны, но их содержимое различается. Пример использования оператора UNION приведен ниже после двух операторов SELECT, выбирающих названия товаров из двух разных таблиц:
SELECT product_name FROM purchase
ORDER BY product_name;
SELECT product_name FROM purchase_archive
ORDER BY product_name;
SELECT product_name FROM purchase
UNION
SELECT product_name FROM purchase_archive
ORDER BY product_name;
Каждая из таблиц содержит некоторые товары, отсутствующие в другой таблице. Список, выведенный оператором UNION, содержит товары, присутствующие одновременно в двух таблицах.
UNION ALL
Оператор объединения UNION ALL функционально похож на оператор UNION, но он возвращает все возможные строки, а не только по одной строке для каждого уникального значения. Увидеть, в чем состоит отличие, можно с помощью следующей команды:
SELECT product_name FROM purchase
UNION ALL
SELECT product_name FROM purchase_archive
ORDER BY product_name;
Этот оператор полезен, когда требуется подсчитать количество экземпляров каждого товара в обеих таблицах.
INTERSECT
Оператор объединения INTERSECT возвращает только те значения, которые присутствуют в обеих таблицах, и задает операцию пересечения, предусмотренную в реляционной алгебре. Если значение найдено лишь в одной таблице, оно игнорируется. Это очень удобно, когда нужно найти значения, общие для пары таблиц:
SELECT product_name FROM purchase
INTERSECT
SELECT product_name FROM purchase_archive
ORDER BY product_name;
MINUS
Оператор объединения MINUS и задает операцию вычитания, предусмотренную в реляционной алгебре. Он противоположен оператору INTERSECT и показывает записи, присутствующие только в первой из двух таблиц. Такая возможность полезна, когда нужно выяснить, какие компоненты не используются и могут быть заархивированы, или определить, какие значения из одной таблицы не представлены в другой:
SELECT product_name FROM purchase
MINUS
SELECT product_name FROM purchase_archive
ORDER BY product_name;
4.2. Подзапросы (вложенные запросы)
Подзапрос это обычный запрос SELECT, вложенный в оператор SELECT, UPDATE или DELETE. Он используется в качестве источника данных для раздела FROM или WHERE родительского оператора.
Подзапрос может содержать внутри себя другие подзапросы. В документации Oracle утверждается, что число уровней вложения не ограничено. "Не ограничено" обычно следует интерпретировать как "зависит от количества доступных ресурсов компьютера, но в любом случае это наверняка больше, чем вам когда-либо потребуется".
Подзапрос применяется в тех случаях, когда для выполнения одного запроса требуется предварительно выполнить другой. Например, чтобы определить, какие товары продаются лучше, чем в среднем, нужно сначала найти это "среднее". Чтобы выяснить, сколько денег заработал старший продавец, нужно знать, кто является старшим продавцом. Чтобы установить, какие товары продаются хуже, чем в прошлом году, нужно знать, как они продавались год назад. Во всех этих ситуациях необходимая информация может быть получена с помощью подзапроса.
Однострочные подзапросы
Что получить все сведения о товарах с наименованием "Small Widget", поступивших в день последнего пополнения запасов этого товара, можно воспользоваться следующим оператором SELECT, содержащим подзапрос:

SELECT * FROM product
WHERE last_stock_date = (
SELECT last_stock_date FROM product
WHERE product_name = 'Small Widget'
) ;
Ключевой характеристикой такого подзапроса является то, что он возвращает единственное значение. Например, подзапрос для определения даты последнего пополнения запасов Small Widget, может возвратить только одно значение, поскольку для хранения этой даты в таблице товаров отведен только один столбец. В этом случае в условии поиска предложения WHERE внешнего оператора можно уверенно ставить знак равенства. Если бы подзапрос потенциально мог возвращать несколько значений, знак равенства нельзя было бы использовать, поскольку дата последнего пополнения запасов во внешнем операторе всегда имеет только одно значение.
Подзапрос такого типа называется однострочным подзапросом (single-row subquery), поскольку он может возвращать только одну строку результатов. Внешний оператор может возвращать любое число строк на основе одного ответа подзапроса.
Подзапрос и внешний оператор могут ссылаться на совершенно разные таблицы. Допустим, нужно узнать обо всех продажах, которые выполнил Гари Андерсон. Известно только имя продавца, но не код, под которым он значится в таблице покупок. Следовательно, нужно сделать так, чтобы оператор SELECT сам нашел код Гари Андерсона, а потом показал записи о его продажах:
SELECT * FROM purchase
WHERE salesperson = (
SELECT person_code
FROM person
WHERE first_name = 'Gary' AND last_name = 'Anderson' ) ;
Получить список самых дорогих товаров можно с помощью подзапроса, определяющего среднюю цену товара:
SELECT * FROM product
WHERE product_price > (
SELECT AVG(product_price)
FROM product ) ;
Многострочные подзапросы
Многострочный подзапрос (multirow subquery) это подзапрос, который может возвращать более одной строки результатов. Для таких подзапросов нельзя выполнять сравнение с помощью знака равенства; необходимо использовать операцию IN.
Например, чтобы узнать, какие товары не продаются, можно получить с помощью подзапроса список всех названий товаров из таблицы покупок, а затем передать его внешнему оператору, чтобы исключить записи об этих товарах из выходных данных:
SELECT * FROM product
WHERE product_name NOT IN (
SELECT DISTINCT product_name
FROM purchase
)
ORDER BY product_name ;
Если поступило распоряжение снизить на 10% цены всех товаров, не пользующихся спросом, то это можно сделать единственной командой UPDATE, поместив в ее предложение WHERE подзапрос, определяющий, какие товары не продавались:
UPDATE product
SET product_price = product_price * 0.9
WHERE product_name NOT IN (
SELECT DISTINCT product_name
FROM purchase
) ;
Подзапросы, возвращающие более одного столбца
Все подзапросы, рассмотренные до сих пор, извлекали только один столбец данных. Однако они могут возвращать и несколько столбцов. Эту возможность демонстрирует приведенный ниже код, который анализирует названия товаров и даты покупок из таблицы PURCHASE, чтобы вернуть записи только о самых последних покупках каждого товара:
SELECT * FROM purchase
WHERE (product_name, purchase_date)
IN (SELECT product_name, MAX(purchase_date)
FROM purchase
GROUP BY product_name
) ;
4.3. Перенос данных между таблицами
Копирование записей из одной таблицы в другую важно уметь делать по целому ряду причин:
импорт данных из унаследованной системы. Типичной задачей, возникающей при работе с SQL, является перенос данных из существующей системы в новую. Иногда существующая система просто заменяется новой. В других случаях нужно отображать и переносить в свою систему данные, полученные из внешнего источника. Зачастую исходные данные должны модифицироваться до занесения в новые таблицы, что может потребовать использования таких функций, как UPPER, LOWER, LTRIM, RTRIM, SUBSTR, INSTR, TO_CHAR и DECODE;
загрузка итоговых значений в хранилище данных. Основной функцией хранилища данных (data warehouse) является хранение предварительно полученных ответов на часто задаваемые вопросы имеются в виду те вопросы, на которые можно ответить с помощью функций SUM, COUNT, AVG, MIN и МАХ в сочетании с предложениями GROUP BY. Ответы обычно хранятся в отдельном наборе таблиц, которые заполняются путем выполнения SQL-запросов;
копирование реляционных данных в плоские файлы для ускорения доступа. Реляционные базы данных обеспечивают наиболее эффективное хранение информации, но ее извлечение из реляционных таблиц может занимать довольно много времени, поскольку таблицы требуется соединять. В некоторых приложениях имеет смысл скопировать реляционные данные из многих таблиц в одну таблицу плоского файла, где все соединения уже выполнены. Таблица плоского файла занимает больше места, чем исходные реляционные таблицы, но доступ к ней может осуществляться быстрее, поскольку отпадает необходимость в соединениях.
Перенос данных с помощью оператора INSERT
Популярным способом переноса данных является использование команды INSERT с подзапросом, извлекающим вставляемые данные из другой таблицы. Для демонстрации этого приема можно создать таблицу командой
CREATE TABLE purchase_log (
purchase_date DATE,
product_name VARCHAR2(25),
product_price NUMBER(4,2),
quantity NUMBER(4,2),
sales_first_name VARCHAR2(15),
sales_last_name VARCHAR2(20)
)
;
Таблица PURCHASE_LOG это "плоское" представление наиболее важной информации о каждой покупке: даты продажи, названия, цены и количества купленного товара, а также полного имени продавца. Подобная таблица хорошо подходит для получения ответов на вопросы типа: "Кто продал наибольшее и наименьшее количество Red Snaphoo?" Помещение в одну таблицу всей информации, необходимой для ответа на такие вопросы, позволяет получать ответы быстрее и гарантирует, что обращение к исходным таблицам не будет замедляться запросами от людей, которым нужно анализировать содержищиеся в этих таблицах данные.
Теперь, когда есть таблица плоского файла для хранения записей, подлежащих анализу, можно заполнить ее данными. Это будет сделано при помощи команды INSERT, соединяющей записи из таблиц PERSON, PRODUCT и PURCHASE. Ее синтаксис выглядит следующим образом:
INSERT INТО имя_таблицы (
оператор SELECT
) ;
Оператор SELECT это любая команда SELECT, которая выдает нужные данные со структурой, соответствующей структуре таблицы назначения. Ниже приведен пример использования этого синтаксиса:
INSERT INTO purchase_log (
SELECT purc.purchase_date,
prod.product_name,
prod.product_price,
purc.quantity,
pers.first_name,
pers.last_name
FROM product prod,
person pers,
purchase purc
WHERE prod.product_name = purc.product_name
AND
pers.person_code = purc.salesperson
)
;
Таблица PURCHASE_LOG содержит удобные для анализа наборы данных о каждой продаже из таблицы PURCHASE.
Следует отметить, что в стандарте языка SQL предусмотрен многострочный оператор INSERT, выполняющий те же действия, но синтаксис которого отличается от приведенного выше отсутствием круглых скобок.
Создание новой таблицы на основе уже существующей
В рассмотренном выше методе копирования данных из одной таблицы в другую предполагалось, что таблица назначения уже существует. Это вполне подходит для ежедневного добавления записей в таблицу назначения, но вместе с тем есть и более простой способ создать эту таблицу и заполнить ее данными. Нужно использовать разновидность команды CREATE TABLE со следующим синтаксисом:
CREATE TABLE имя_новой_таблицы AS
оператор SELECT ;
В данном случае оператор SELECT будет тем же самым оператором SELECT, с помощью которого заполнялась первая таблица назначения:
C
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Переименование таблиц
Иногда приходится менять имена существующих таблиц. Это делается командой с таким синтаксисом:
RENAME старое_имя_таблицы ТО новое_имя_таблицы; ,
Например:
RENAME purchase_log2 TO log;
4.5. Изменение структуры таблицы
За время существования базы данных могут измениться бизнес-требования, которым она должна удовлетворять. Зачастую это служит причиной для изменения структуры таблиц, уже содержащихся в базе данных. Некоторые изменения выполняются довольно просто. К ним относятся добавление новых столбцов, изменение типа данных существующих столбцов и изменение null-опций столбцов.
Добавление столбцов
Добавлять к таблице столбцы можно в любой момент. Новые столбцы размещаются в конце табличной структуры после всех существующих столбцов. Используемый для этого синтаксис выглядит следующим образом:
ALTER TABLE имя_таблицы
ADD имя_нового_столбца тип данных [NOT NULL] ;
Добавить столбец к таблице LOG и проверить результат можно такими командами:
DESC log
ALTER TABLE log
ADD data_load_date VARCHAR2(8) ;
DESC log
Изменение типа данных столбца
Изменить тип данных столбца на более подходящий можно командой, имеющей следующий синтаксис:
ALTER TABLE имя_таблицы
MODIFY имя_столбца новый_тип_данных ;
Например:
ALTER TABLE log
MODIFY data_load_date DATE ;
Изменение null-опций
Часто во время разработки базы данных оончательно не решено, какие столбцы будут обязательными, а какие нет. В таких случаях обычно создаются столбцы, допускающие null-значения, а потом, при необходимости, их статус меняется на противоположный. (Разумеется, с тем же успехом можно превратить столбцы NOT NULL в NULL.) Для этого используется следующий синтаксис:
ALTER TABLE имя_таблицы
MODIFY имя_столбца NOT NULL ;
Прежде чем модифицировать новый столбец таким образом, необходимо заполнить его в каждой из существующих записей, как сделано в приведенной ниже последовательности команд:
UPDATE log SET data_load_date = '15-DEC-2007' ;
DESC log
ALTER TABLE log MODIFY data_load_date NOT NULL ;
DESC log
4.6. Представления
Идея представления (view) проста: определить запрос, который предполагается часто использовать, сохранить его в базе данных Oracle и разрешить пользователям обращаться к нему по имени, как к обычной таблице. Когда пользователь выбирает данные из представления, Oracle выполняет соответствующий запрос, организует результаты так, как определено в представлении, и выдает их пользователю. Для пользователя представление выглядит как таблица, из которой поступают данные. Однако на самом деле данные поступают через представление, из одного или нескольких других источников.
Представления нужны по целому ряду причин. В частности, представления широко применяются для соединения данных из двух и более таблиц и выдачи их пользователям в виде одного легко читаемого списка. Упрощая процесс выборки записей до такой степени, когда пользователям не нужно знать, как соединяются таблицы, разработчик делает данные доступными для большего числа людей.
С помощью представлений удобно поддерживать безопасность, поскольку они позволяют ограничивать диапазон строк и столбцов, возвращаемых пользователям. Если нужно, чтобы пользователи не видели столбец с зарплатой из таблицы личных данных, то не следует включать его в определение представления. Для пользователей представления этот столбец не будет существовать. То же самое справедливо и для строк: включение в представление предложения WHERE обеспечит фильтрацию возвращаемых записей нужным образом.
Наконец, представления могут сделать работу с таблицами более удобной. Конечно, никогда не следует разрабатывать таблицы, столбцы которых имеют непонятные имена или расположены в странном порядке, но так могут сделать другие, и рано или поздно придется использовать их таблицы. Поскольку представление это просто хранимый запрос, то в представлении всегда можно поменять как имена столбцов, так и порядок их отображения.
Создание представления
Для создания представления нужно указать только имя представления и оператор SELECT, который будет выполняться при обращении к представлению:
CREATE OR REPLACE VIEW имя_представления AS
оператор SELECT ;
В операторе CREATE присутствует элемент OR REPLACE, который позволяет создавать новое представление даже тогда, когда представление с указанным именем уже существует (при этом существующее представление перезаписывается):
CREATE OR REPLACE VIEW sales_by_atlas_v AS
SELECT * FROM purchase WHERE salesperson = 'CA'
;
SELECT * FROM sales_by_atlas_v;
Следующие команды показывают, как создать представление для просмотра данных из соединенных таблиц:
CREATE
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·В последнем примере предложение ORDER BY включено в оператор SELECT, извлекающий данные из представления, а не в само представление. До появления Oracle 8i представления не могли содержать предложение ORDER BY. В 8i и последующих версиях можно заставить представление сортировать отображаемые записи, указав сразу после предложения WHERE предложение ORDER BY, как в стандартном операторе SELECT.
Удаление представлений
Удалить представление так же легко, как и таблицу, но это действие менее разрушительно, поскольку представление не содержит никаких данных; самое худшее, к чему может привести случайное удаление представления, это к необходимости создавать его заново. Команда, удаляющая представление, имеет следующий синтаксис:
DROP VIEW имя_представления ;
Например:
DROP VIEW sales_per_person_v ;
Изменение определения представления
Oracle не позволяет изменять существующее представление. Единственный способ изменить представление это удалить его и создать заново. По этой причине все команды создания представлений следует хранить в файлах сценариев. При необходимости изменить представление достаточно будет открыть файл сценария, изменить содержащуюся в нем команду CREATE VIEW и запустить сценарий еще раз.
Анализ первых N записей
Для анализа первых по счету записей таблицы результатов используется тот факт, что каждой записи, возвращаемой в результате обработки любого запроса, динамически присваивается порядковый номер. Первая (или единственная) возвращенная запись получит номер 1 независимо от своего положения в таблице. На эти номера можно ссылаться в предложении WHERE. Если в операторе SELECT выполняется сортировка результатов, можно добиться того, что Oracle покажет 5, 50 или 500 наиболее важных записей, дополнив оператор предложением WHERE, ограничивающим количество выводимых строк. Синтаксис, позволяющий это реализовать, выглядит следующим образом:
SELECT имя_столбца_1 [, имя_столбца_2...]
FROM имя_таблщы
WHERE ROWNUM <= нужное_число_записей
ORDER BY столбец_сортировки ;
Приведенная ниже команда создает представление, показывающее три товара, которых больше всего на складе:
CREATE OR REPLACE VIEW overstocked_items AS
SELECT product_name, quantity_on_hand
FROM product
WHERE ROWNUM <= 3
ORDER BY quantity_on_hand
;
SELECT * FROM overstocked_items;
4.7. Другие объекты базы данных
Последовательности
Базы данных предназначены для поддержания порядка в массивах информации. Одним из способов упорядочения записей является присваивание им последовательных номеров. Oracle позволяет создавать счетчики, называемые последовательностями (sequences), которые увеличиваются каждый раз, когда к ним происходит обращение. Ссылаясь на последовательность при вставке записей, можно гарантировать, что каждой записи будет присвоен новый уникальный номер.
Создание последовательности
Для создания последовательности используется следующий синтаксис:
CREATE SEQUENCE имя_последователъности ;
Эта простая команда создает последовательность, которая начинается с 1 и увеличивается на 1 при каждом обращении. Ничего другого от последовательностей часто и не требуется. Тем не менее при определении последовательности можно использовать много дополнительных параметров. Ниже приведен синтаксис, в котором перечислены наиболее полезные из параметров:
CREATE SEQUENCE имя_последовательности
[INCREMENT BY значение_инкремента]
[START WITH начальное_значение]
[MAXVALUE наибольшее_значение]
[MINVALUE наименьшее_значение]
[CYCLE]
;
Параметр INCREMENT BY позволяет создавать последовательности с инкрементом, отличным от 1. Значение этого параметра может содержать до 28 цифр (хотя трудно представить ситуации, где может найти применение такой инкремент!). Если указать здесь отрицательное число, то значение последовательности будет уменьшаться при каждом обращении.
Параметр START WITH позволяет создать последовательность, начальное значение которой отлично от 1 . Это может пригодиться при создании последовательности для таблицы, уже содержащей записи, чтобы начать последовательность с числа, следующего за наибольшим существующим идентификатором записи.
Параметры MAXVALUE и MINVALUE позволяют ограничить интервал чисел, генерируемых последовательностью. Если использовать их в сочетании с параметром CYCLE, заданное множество значений будет циклически повторяться.
Наиболее распространены последовательности с инкрементом 1 и без ограничений на генерируемые значения. Создатm такую последовательность можно с помощью приведенной ниже команды:
CREATE SEQUENCE test_seq;
Использование последовательности
Чтобы получать значения последовательности, на нее необходимо ссылаться как на таблицу. Последовательности содержат два "псевдостолбца" с именами CURRVAL и NEXTVAL, которые возвращают текущее и следующее значения последовательности соответственно. Выборка из столбца NEXTVAL вызывает автоматический инкремент последовательности.
Чтобы увидеть, как это происходит, можно введите следующие команды:
SELECT test_seq.nextval FROM DUAL;
SELECT test_seq.nextval FROM DUAL;
SELECT test_seq.nextval FROM DUAL;
Чтобы заполнить столбцы таблицы значениями из последовательности, нужно включить ссылки на последовательность в оператор INSERT, как в приведенных ниже командах:
CREATE TABLE test (
record_id NUMBER (18, 0),
record_text VARCHAR2 (10)
);
INSERT INTO test VALUES ( test_seq.nextval, 'Record A' ) ;
INSERT INTO test VALUES ( test_seq.nextval, 'Record B' ) ;
SELECT * FROM test;
Хотя последовательности обычно создаются для одной таблицы, в Oracle нет ограничения, которое бы этого требовало. Последовательность является независимым объектом. Она может использоваться в одной таблице, во многих таблицах или ни в одной из таблиц.
В методе, который только что использован, демонстрировалось обращение к последовательности при помощи явной ссылки в операторе INSERT. Можно также организовать автоматическое обращение к последовательности, чтобы не ссылаться на нее в операторе INSERT.
Модификация существующей последовательности
Созданную последовательность можно модифицировать различными способами. В частности, можно изменить значение инкремента, скорректировать или удалить минимальное и максимальное значения, разрешить или запретить циклический повтор по достижении граничного значения.
Синтаксис, позволяющий выполнять эти изменения в существующей последовательности, очень похож на синтаксис, используемый для ее создания. Он выглядит следующим образом:
ALTER SEQUENCE имя последовательности
[INCREMENT BY значение_инкремента]
[MAXVALUE наибольшее_значение | NOMAXVALUE]
[MINVALUE наименыиее_значение | NOMINVALUE]
[CYCLE | NOCYCLE] ;
В качестве примера можно введите следующие команды:
ALTER SEQUENCE test_seq
MAXVALUE 10 ;
SELECT test_seq.nextval FROM DUAL;
SELECT test_seq.nextval FROM DUAL;
SELECT test_seq.nextval FROM DUAL;
SELECT test_seq.nextval FROM DUAL;
SELECT test_seq.nextval FROM DUAL;
SELECT test_seq.nextval FROM DUAL;
Синонимы
Синоним (synonym) позволяет ссылаться на объект Oracle по имени, которое отличается от его настоящего имени. Синонимы можно определять для таблиц, представлений, последовательностей, а также других объектов. В этом разделе рассиатриваются синонимы таблиц, но все сказанное ниже применимо и к синонимам других объектов.
Синоним создается главным образом для удобства: если часто приходится ссылаться на таблицу с длинным именем, то можно по достоинству оценить возможность использования короткого имени без переименования таблицы и изменения кода, который на нее ссылается.
Удобство синонимов проявляется и в том, что они могут облегчить доступ к вашим данным для других людей. Таблицы организуются по идентификатору пользователя Oracle, который их создает, поэтому если другой пользователь захочет обращаться к таблице, созданной другим пользователем, то в общем случае ему придется помещать перед именем таблицы имя другого пользователя, как показано ниже:
SELECT * FRОМ имя_пользователя . имя_таблщы;
Это может оказаться утомительным занятием, а если вы передадите свою таблицу кому-то другому, то вдобавок потребуется менять весь код, который на нее ссылается. Синонимы позволяют сделать таблицу "видимой" для всех, даже если не указано имя ее владельца. Благодаря этому можно писать SQL-операторы, которые будут продолжать работать даже при передаче таблицы другому пользователю.
Создание синонима
Команда создания синонима имеет следующий синтаксис:
CREATE [PUBLIC] SYNONYM имя_синонима
FOR имя объекта ;
Чтобы увидеть, как используются синонимы, можно воспользоваться приведенными ниже команды:
SELECT * FROM product;
CREATE SYNONYM prod FOR product;
SELECT * FROM prod;
Если нужно сделать таблицу доступной другим пользователям, достаточно создать синоним с тем же именем, что и у таблицы:
CREATE PUBLIC SYNONYM product FOR product;
Модификация существующего синонима
Ввиду чрезвычайной простоты синонимов Oracle не предоставляет никаких средств для их изменения. При необходимости просто удаляется старый синоним и создается новый. Команда удаления синонима имеет следующий синтаксис:
DROP [PUBLIC] SYNONYM имя_синонима;
Первый из созданных выше синонимов (PROD) удаляется следующей командой:
DROP SYNONYM prod;
Для удаления общего синонима используется команда
DROP PUBLIC SYNONYM product;
Словарь данных Oracle
База данных Oracle состоит из множества различных объектов: таблиц, столбцов, представлений, связей, ограничений, последовательностей и т.д. Чтобы следить за всеми этими объектами, Oracle сохраняет информацию о них в словаре данных (data dictionary). Словарь данных представляет собой набор таблиц и представлений, содержащих самую последнюю информацию о каждом объекте и пользователе базы данных. Он содержит каждую характеристику, указанную вами создании объекта, а также служебную информацию в частности, размер пространства, выделенного объекту, размер используемого пространства и права пользователей, относящиеся к этому объекту.
Опрос словаря данных для получения информации о пользователях и базе данных
Полный список объектов словаря данных можно получить из представления с именем DICT. Приведенная ниже команда показывает этот список вместе с полезной дополнительной информацией.
SELECT table_name, SUBSTR(comments, 1, 45)
FROM dict
WHERE SUBSTR(comments, 1, 7) <> 'Synonym' ;
В команде использована конструкция WHERE, исключающая сведения о синонимах.

Использование различных представлений словаря данных
В Oracle существует так много различных представлений словаря данных, что об их использовании можно написать отдельное пособие. Наиболее полезны два представления, которые показывают списки собственных таблиц и представлений пользователя. Следующая команда покажет список всех таблиц пользователя:
SELECT table_name FROM user_tables;
Список всех созданных пользователем представлений выводит команда
SELECT view_name FROM user_views;
Эти команды приносят пользу в тех случаях, когда точно не известны имена таблиц или представлений, или необходимо проверить их существование.




Root Entry

Приложенные файлы

  • doc 7066433
    Размер файла: 322 kB Загрузок: 0

Добавить комментарий