- •Вопросы к экзамену по БиБд:
- •Ответы к вопросам:
- •Технология "клиент-сервер"
- •Параметры
- •Возвращаемое значение
- •Реализации
- •Регулярные выражения
- •Синтаксис
- •Спецсимволы
- •Расширенные спецсимволы
- •Операторы
- •Расширенные операторы
- •Er-модель данных
- •История создания[править]
- •Нотации[править]
- •Нотация Питера Чена[править]
- •Crow's Foot[править]
- •6.2.2. Основные понятия модели Entity-Relationship (Сущность-Связи)
- •6.2.3. Нормальные формы er-схем
- •11.5. Проектирование базы данных с помощью метода er-моделирования
- •11.5. Проектирование базы данных с помощью метода er-моделирования
- •4.4 Хранимые процедуры
При обращении к примеру п.43, процедура будет иметь вид:
Create or replace procedure myproc ( derpno number, count out number)
Is
Begin
Select count (x)
Into pcount
From employe
Where derp = derpno
End myproc
4.4 Хранимые процедуры
Хранимая процедура (stored procedure) — это программа, которая вы полняет некоторые действия с информацией в базе данных и при этом сама хранится в базе данных. В Oracle хранимые процедуры можно мож но писать на языках PL/SQL и Java.
Хранимые процедуры могут входные параметры и возвращать резуль таты. В отличие от триггеров, которые принадлежат определенной табли це или представлению, хранимые процедуры принадлежат базе данных в целом. Они могут вызываться любым процессом, использующим базу дан ных, при условии, что у этого процесса есть достаточные права доступа.
Яндекс.ДиректВсе объявленияНовости Беларуси на News.TUT.BY! Самые свежие и актуальные новости страны и мира на News.TUT.BY!news.tut.by
Дома продают по 20-30 тысячНовости: из за кризиса дома в Болгарии продают по 20-30 тысяч.house.yoread.ru
Хранимые процедуры используются для многих целей. Хотя админи страторы баз данных используют их для выполнения рутинных задач ад министрирования, главной областью их применения являются все же при ложения баз данных. Эти процедуры могут вызываться из прикладных программ, написанных на таких языках, как Java, С#, С++ или VB.Net, а также из веб-сценариев, написанных на VBScript или JavaScript. Кроме того, эти процедуры можно вызывать в интерактивном режиме из команд ной оболочки SQL*Plus.
Можно выделить следующие преимущества хранимых процедур:
В отличие от кода приложений, хранимые процедуры никогда не пере даются на клиентские компьютеры. Она всегда находятся в базе данных и выполняются СУБД на том компьютере, где располагается сервер базы данных. Таким образом, они более безопасны, чем распространяемый код приложения, а кроме того, снижают сетевой трафик. Хранимые процеду ры постепенно становятся предпочтительным режимом реализации логи ки приложения в сети Интернет и корпоративных интрасетях. Еще одно преимущество хранимых процедур заключается в том, что SQL-операторы в них могут быть оптимизированы компилятором СУБД.
Пример хранимой процедуры
Предположим, для нашего примера требуется возможность добавлять в базу данных сведения о новых клиентах и о том, какими художниками они интересуются. В частности, нужно записывать имя и телефон клиента, а также связывать его со всеми художниками выбранной национальности.
В листинге 4.6 изображена хранимая процедура, выполняющая эту за дачу. Процедура, которая называется Customer_Insert, принимает четы ре параметра: newname (имя нового клиента), newareacode (код региона), newphone (телефон) и artistnationality (национальность художника). Клю чевое слово IN указывает на то, что все эти параметры являются входны ми. Выходные параметры (которых у этой процедуры нет) обозначаются ключевым словом OUT, а параметры, играющие роль и входных и вы ходных, — сочетанием IN OUT. Следует обратить внимание, что для параметра указывается только тип данных, а длина не указывается. Oracle определит длину из контекста.
Листинг 4.6.
CREATE OR REPLACE PROCEDURE Customer_Insert ( newname IN char, newareacode IN char, newphone IN char, artistnationality IN char ) AS rowcount integer(2); CURSOR artistcursor IS SELECT ArtistID FROM ARTIST WHERE Nationality = artistnationality; BEGIN SELECT Count(*) INTO rowcount FROM CUSTOMER WHERE Name = newname AND AreaCode = newareacode AND PhoneNumber = newphone; IF rowcount > 0 THEN BEGIN DBMS_OUTPUT.PUT_LINE ('There is client in DB! Count is ' I I rowcount); RETURN; END; END IF; INSERT INTO CUSTOMER (CustomerlD, Name, AreaCode, PhoneNumber) VALUES (CustID.NextVal, newname, newareacode, newphone); FOR artist IN artistcursor LOOP INSERT INTO CUSTOMER_ARTIST_INT (CustomerlD, ArtistID) VALUES (CustID.CurrVal, artist.Artist ID); END LOOP; DBMS_OUTPUT.PUT_LINE ('Client is added!'); END; /
Раздел объявления переменных следует за ключевым словом AS. Опе ратор SELECT определяет переменную-курсор (cursor variable) с именем artistcursor. Этот курсор выделяет из таблицы ARTIST для обработки строки всех художников заданной национальности.
В первой части процедуры проверяется, есть ли в базе информация о данном клиенте. В этом случае никакие действия не предпринимаются, а пользователю с помощью пакета Oracle DBMS_OUTPUT выводится соответствующее сообщение. Следует обратить внимание, что для вывода строки и значения переменной используется следующий синтаксис:
DBMS_OUTPUT.PUT_LINE ('<строка>' И <переменная>);
Пользователь получит это сообщение только в том случае, если проце дура будет вызвана из SQL*Plus. В случае вызова процедуры иным путем, например с помощью браузера через Интернет, пользователь не увидит этого сообщения. Чтобы сообщить пользователю об ошибке, разработчик должен воспользоваться выходным параметром или сгенерировать исклю чение.
Кроме того, чтобы такие сообщения стали видимыми, следует выпол нить команду
Set serveroutput on;
Если при работе в SQL*Plus вы не видите сообщений, выводимых ва шими процедурами, то, скорее всего, вы не выполнили этот оператор.
Оставшаяся часть процедуры в листинге 4.6 вставляет данные о новом клиенте и затем перебирает всех художников выбранной национальности. Обратите внимание на использование специальной конструкции PL/SQL FOR artist IN artistcursor. Эта конструкция выполняет несколько задач. Прежде всего, она открывает курсор и считывает первую строку. Затем она последовательно обрабатывает все строки под курсором и по оконча нии обработки передает управление следующему оператору после FOR. Заметьте также, что обращение к столбцу ArtistID текущей строки про исходит с использованием синтаксиса artist.ArtistID, где artist — это имя переменной цикла FOR, а не курсора.
После того как процедура написана, ее необходимо скомпилировать и сохранить в базе данных. Если текст процедуры сохранен в файле, то про цедура будет скомпилирована и сохранена в базе данных автоматически после ввода команды
start Имя_файла_процедуры
Если вы что-то ввели неправильно, у вас могут возникнуть ошибки компиляции. К сожалению, SQL*Plus не покажет вам эти ошибки автома тически, а выдаст сообщение "Warning: Procedure created with compilation errors "(Предупреждение: При компиляции процедуры обнаружены ошиб ки). Чтобы увидеть ошибки, введите команду:
Show errors;
Если синтаксических ошибок не было, вы получите сообщение "Procedure created "(Процедура создана). Теперь вы можете вызвать эту процедуру с помощью команды EXECUTE или EXEC:
Exec Customer_Insert('Michael Bench', '203', '555-2014', 'US');
Если возникнут ошибки на этапе выполнения процедуры, номера строк в отчете об ошибках не будут совпадать с номерами строк, которые вы можете видеть в своем текстовом редакторе.
Развитые типы данных Oracle (массив, таблица, объект)
Массив varray представляет собой коллекцию объектов определённого типа.
SQL> create type
Tax_tp as object(
Year Date
Tax number);
SQL>create type
My_arr as array(3) of Tax_tp;
Объявление массива:
DECLARE
TYPE t_ar IS VARRAY(250) OF VARCHAR(100);
V1 t_ar;
i NUMBER :=0
BEGIN
LOOP
IF (i >= 100) THEN
EXIT;
END IF;
V1(i):=TO CHAR(i);
END LOOP;
END
Типовая заготовка (структура) ХП oracle может быть представлена определённым образом:
Create or replace procedure
имя_процедуры
Is
Declare
…объявление переменных и типов…
Begin
… исполнительный порядок…
Exception
…Обработка исключения…
End имя_процедуры
Таблицы:
Тип таблиц ближе к массивам, но отличие в том, что каждый элемент таблицы имеет индекс, например, V(-15):=’Mir’. Количество элементов не фиксировано, объявление таблицы:
DECLARE
TYPE t_tab IS TABLE OF VARCHAR(10)
INDEX BY BINARY_INTEGER;
V1 t_tab
BEGIN
V1(-4) = ‘John’
V1(0) = ‘Doe’;
END;
В отличии от массива, в таблице индексы не обязаны последовательно возрастать. Пример с заполнением таблицы:
DECLARE
TYPE t_tab IS TABLE OF Stud %TYPE
INDEX BY BINARY INTEGER;
V1.t_tab
BEGIN
SELECT * INTO V1(-2)
FROM stud
WHERE Id = -2
END;
В таблице и массиве есть ряд доступных свойств: COUNT, FIRST, LAST, NEXT, DELETE(10) (удаление строки с индексом 10), DELETE(10,200) (удаление записи из диапазона от 10 до 200). Пример:
DECLARE
TYPE t_tab IS TABLE OF stud.FN%TYPE
INDEX BY BINARY_INTEGER;
FNAMES t_tab;
BEGIN
FNAMES(1):=’John’;
FNAMES(3):=’Doe’;
IF FNAMES.EXISTS(1) THEN FNAMES.DELETE(1)
END IF;
END
Курсоры:
Declare
Cursor ordc is
Select * from Orders;
Cursor get_Orditem(prom_num orders.ord_num % type) is
Select quantity
From orders where ord_num = prod.num;
Пример работы с курсорами:
DECLARE
V_stud students.IO%TYPE;
V_FirstName students.FirstName%TYPE;
V_Depart students.Department%TYPE:=”Computer Science”;
CURSOR c_Students IS
SELECT id, FirstName
FROM students
WHERE Department=V_Depart
Begin
Open c_Students;
LOOP
FETCH c_Students INTO V_stud, v_FirstName
EXIT WHEN
C_Students% NOT FOUND;
END LOOP
CLOSE c_Students;
END;
Пример с курсорными переменными:
DECLARE
TYPE L_classes IS REF CURSOR
Return classes%ROWTYPE
V_c1 c_Classes;
Open v_c1 FOR
SELECT * FROM Classes;
REF – ссылка на курсор; V_c1 – курсорная переменная.
Пример с функцией:
CREATE OR REPLACE FUNCTION MyFun (x IN BOOLEN)
RETURN VARCHAR2
IS
DECLARE
Str VARCHAR(5);
Begin
IF (x) THEN
Str:=”TRUE”;
ELSE
Str:=”FALSE”;
ENDIF
RETURN(Str);
END MyFun
Также имеется большое количество встроенных функций, таких как CHR(x) (возврат символа в формате ASCII), CONCAT(s1,s2) (Объединение строк), SUBSTR(s,n1,n2) (выделение в строке S n2 символов начиная с n1) и так далее.