специальный триггер, называемый замещающим триггером (триггер INSTEAD OF).
ОБЯЗАТЕЛЬНЫ ДЛЯ ВЫПОЛНЕНИЯ!!!
1.Вывести на экран информацию о таблицах пользователя
2.Вывести на экран информацию о структуре одной из таблиц
3.Вывести в отчет информацию физических атрибутах таблицы Artist
Ввести данные для следующих ситуаций:
4.На склад поступили репродукции картин 2-х русских художниках. Как минимум одно произведение - первого художника и два произведения -
второго. (Прошу обратить внимание, что требуются данные о реальных художниках!)
5.Сначала появился первый покупатель и приобрел картину первого художника. Затем появился другой покупатель и приобрел репродукции второго художника. Сделки были оформлены.
6.Внести данные в соответствующие таблицы «Вручную!!!», в том числе отобразить предпочтения покупателя к картинам определенных художников.
7.Последовательно отобразить СОДЕРЖИМОЕ ВСЕХ ТАБЛИЦ!!!
31
Есть много способов обработки баз данных Oracle из приложений. Один из способов заключается в том, чтобы создавать приложения на C++, С#, Java, Visual Basic или каком-либо другом языке программирования и вызывать из них программы Oracle. Для этого можно воспользоваться кодовыми библиотеками Oracle или задействовать промышленные стандарты ODBC или
JDBC.
Другой способ обработки баз данных Oracle состоит в написании процедур на PL/SQL. Эти процедуры можно хранить в виде файлов, запускаемых по команде START в SQL Plus, в виде хранимых процедур в базе данных, а также в виде триггеров, которые вызываются при наступлении определенных событий. Рассмотрим каждый из этих вариантов.
Если пользователь базы данных имеет доступ к SQL Plus, он может сохранить операторы PL/SQL в файле и запускать их напрямую командой START. Файл, содержащий оператор
SELECT *
FROM ExpensiveArt:
/
можно сохранить под именем ToSell.sqL Пользователь откроет SQL Plus и введет команду
Start ToSell:
Врезультате будут выведены данные из представления ExpensiveArt.
Вреальности большинство пользователей в деловом мире не имеет доступа
кSQL Plus, а если бы и имели, то вряд ли работа с этой программой пришлась бы им по вкусу. Однако этот стиль обработки используется администраторами и разработчиками баз данных для автоматизации рутинных задач администрирования.
Хранимая процедура — это программа на языке PL/SQL или Java, которая хранится в базе данных. Хранимые процедуры могут иметь параметры, вызывать другие процедуры и функции, возвращать значения и генерировать
32
исключения. Хранимые процедуры могут вызываться удаленно. Мы рассмотрим два примера хранимых процедур.
Галерее View Ridge требуется возможность добавлять в базу данных новых клиентов и записывать информацию о художниках, работами которых клиенты интересуются. В частности, нужно записывать имя и телефоны клиента, а также ассоциировать его со всеми художниками выбранной национальности.
В листинге 1 показана хранимая процедура, выполняющая эту задачу. Процедура, которая называется Customer_Insert, принимает четыре параметра: newname (имя нового клиента), newareacode (код региона), newphone (телефон) и artistnationality (национальность художника). Ключевое слово IN указывает на то, что вес эти параметры являются входными. Выходные параметры (которых у этой процедуры нет) обозначаются ключевым словом OUT, а параметры, играющие роль и входных, и выходных, — сочетанием IN OUT. Обратите внимание, что для параметра указывается тип данных, но не длина. Oracle определит длину из контекста.
CREATE OR REPLACE PROCEDURE CustomerInsert
( |
|
|
newname |
IN |
char, |
newareacode |
|
IN char, |
newphone |
IN |
char, |
artistnationality |
IN char |
|
) |
|
|
AS
rowcount integer(4);
CURSOR artistcursor IS
SELECT ArtistID
FROM ARTIST
WHERE Nationality=artistnationality
33
BEGIN |
|
SELECT |
Count (*) INTO rowcount |
FROM |
CUSTOMER |
WHERE |
Name=newnaine AND Area_Code5newareacode AND |
Phone_Number = newphone;
IF rowcount > 0 THEN BEGIN
DBMS_OUTPUT.PUT_LINE ('Клиент уже есть в базе данных - никаких действий не предпринято');
RETURN;
END; END IF;
INSERT INTO CUSTOMER
(CustomerID, Name, Area_Code, Phone_Number) VALUES
(CustID.NextVal, newname, newareacode, newphone);
FOR artist IN artistcursor LOOP
INSERT INTO CUSTOMER_ARTIST_INT (CustomerID, ArttstID)
VALUES
(CustID.CurrVal, artist.ArtistID); END LOOP;
DBMS_OUTPUT.PUT_LINE (‘ Новый клиент успешно добавлен в базу '); END;
/
Выполнить процедуру!
34
Раздел объявления переменных следует за ключевым словом AS. Оператор SELECT определяет переменную-курсор (cursor variable) с именем artistcursor. Этот курсор выделяет из таблицы ARTIST для обработки строки всех художников заданной национальности.
В первом разделе процедуры выполняется проверка, нет ли уже в базе информации о данном клиенте. В этом случае никакие действия не предпринимаются, а пользователю с помощью пакета Oracle DBMS_OUTPUT выводится соответствующее сообщение.
!!! Обратите внимание, что пользователь получит это сообщение только в том случае, если процедура будет вызвана из SQL Plus. В случае вызова процедуры иным путем, например с помощью браузера через Интернет, пользователь не увидит этого сообщения. Чтобы сообщить пользователю об ошибке, разработчик должен воспользоваться выходным параметром или сгенерировать исключение. Синтаксис для вывода строки и значения переменной, хотя это не показано в листинге 1, имеет вид
DBMS_OUTPUT.PUT_ LINЕ('строка'//переменная).
Кроме того, чтобы такие сообщения стали видимыми, следует выполнить команду
Set serveroutput on:
Если при работе в SQL Plus Вы не видите сообщений, выводимых вашими процедурами, скорее всего, вы не выполнили этот оператор.
Оставшаяся часть процедуры в листинге 1 вставляет данные о новом клиенте и затем перебирает всех художников выбранной национальности. Обратите внимание на использование специальной конструкции PL/SQL
FOR artist IN artistcursor.
Эта конструкция выполняет несколько задач. Прежде всего, она открывает курсор и считывает первую строку. Затем она последовательно обрабатывает все строки под курсором и по окончании обработки передает управление следующему оператору после FOR.
Заметьте также, что обращение к столбцу ArtistID текущей строки происходит с использованием синтаксиса artist.ArtistID, где artist — это имя
переменной цикла FOR, а не курсора.
После того как процедура написана, ее необходимо скомпилировать и сохранить в базе данных. Наберите текст процедуры в редакторе и сохраните
35