- •ВВЕДЕНИЕ
- •1. ВВЕДЕНИЕ В PL/SQL
- •1.1. ОПИСАНИЕ PL/SQL
- •1.2. ПРЕИМУЩЕСТВА PL/SQL
- •2. КОМАНДЫ DATA DEFINITION LANGUAGE (DDL)
- •2.1. ОСНОВНЫЕ ОБЪЕКТЫ ORACLE
- •2.2. ТАБЛИЦЫ
- •2.5. ИЗМЕНЕНИЯ ОБЬЕКТОВ
- •2.3. ПРЕДСТАВЛЕНИЕ (VIEW)
- •2.4. ИНДЕКС
- •КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 2
- •3. ЯЗЫК ORACLE SQL
- •3.3. ВЫБОРКА
- •3.4. ОБРАБОТКА ОШИБОК
- •3.5. ВЫРАЖЕНИЯ
- •КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 3
- •4. ЯЗЫК PL/SQL
- •4.1. ТИПЫ ДАННЫХ PL/SQL
- •4.2. СТРУКТУРА ПРОГРАММЫ НА PL/SQL
- •4.3. УПРАВЛЕНИЕ ВЫПОЛНЕНИЕМ ПРОГРАММЫ
- •4.4. УЧЕБНАЯ БАЗА ДАННЫХ
- •4.5. КУРСОРЫ
- •4.6. ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
- •4.7. СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ПРОЦЕДУР И ФУНКЦИЙ
- •4.8. ПАКЕТЫ PL/SQL
- •4.9. ТРИГГЕРЫ БАЗЫ ДАННЫХ
- •ЗАКЛЮЧЕНИЕ
- •СПИСОК ЛИТЕРАТУРЫ
−EXTEND(n, i) – увеличивает размер таблицы, присоединяет n копий i-гo элемента PL/SQL таблицы;
−TRIM(n) – удаляет n элементов из конца PL/SQL таблицы;
−DELETE(n) – удаляет n элементов из PL/SQL таблицы.
Например, следующим образом можно определить таблицу, каждый элемент которой является записью.
Пример 4.11.
DECLARE
TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY
binary_integer;
dept_table dept_table_type;
Пример 4.12.
DECLARE
TYPE e_table_type IS TABLE OF emp.ename%TYPE INDEX BY bi-
nary_integer;
e_tab e_table_type;
В заключение повторим, что составной тип в PL/SQL есть:
−PL/SQL запись;
−PL/SQL таблица;
−PL/SQL таблица записей.
При определении составного типа необходимо использовать предопределённый метод %ROWTYPE.
Пример 4.13.
DEPT_RECORD DEPT%ROWTYPE; EMP_RECORD EMP%ROWTYPE;
DEPTRECORD содержит ту же информацию, что и поле DEPT таблицы, аналогично EMP_RECORD содержит ту же информацию, что и записи ЕМР таблицы.
4.2. СТРУКТУРА ПРОГРАММЫ НА PL/SQL
Язык PL/SQL является составной частью во многих продуктах Oracle. Сервер Oracle включает поддержку языка PL/SQL, предоставляя пользователю возможность создавать и использовать на сервере процедуры и триггеры базы
46
данных, выполняющие задачи конкретного приложения. Программы, созданные на языке PL/SQL, могут работать совместно в различных частях прикладной системы, построенной на средствах Oracle. Например, в приложении, использующем работу с формами, триггер может вызывать для выполнения некоторого действия хранимую процедуру.
Всякая программа на PL/SQL состоит из трёх блоков: описаний, исполнительного и блока обработки исключительных ситуаций. Исполнительный блок может быть структурирован с использованием операторных скобок BEGIN и END.
Синтаксически программа на PL/SQL оформляется следующим образом: [DECLARE]
-- объявления
BEGIN
-- операторы
[EXCEPTION] -- исключения
END;
В PL/SQL существуют блоки трёх типов: безымянный блок, процедурный блок (PROCEDURE), функция (FUNCTION):
1) безымянный блок
[DECLARE] -- объявления
BEGIN
-- операторы
[EXCEPTION] -- исключения
END;
2) PROCEDURE PROCEDURE name IS BEGIN
-- операторы
[EXCEPTION] -- исключения
END;
3) FUNCTION
FUNCTION name RETURN datatype IS BEGIN
-- операторы
[EXCEPTION] -- исключения
END;
47
В блоке DECLARE описываются переменные, константы и определяемые пользователем типы данных: Identifier [CONSTANT] datatype [NOT
NULL] [:=DEFAULT | expr];
CONSTANT – это ограничение на переменную, которая не меняется в программе, но должна быть инициализирована. Две переменные в разных блоках могут иметь одинаковые имена, переменным внутри одного блока не рекомендуется давать те же имена, что и имена столбцов в таблицах в этом блоке.
Пример 4.14.
DECLARE Emp NUMBER(4); BEGIN
SELECT emp INTO emp FROM em WHERE ename =’Smith';
END;
Такое применение переменной EMP разрешено, так как таблица ЕМ определена в другом блоке.
Первый оператор BEGIN отмечает начало тела основной программы. В тело программы могут быть вложены другие блоки, ограниченные операторными скобками BEGIN и END. В блоке EXCEPTION определяются фрагменты программного кода для обработки исключительных ситуаций в программе. Последний оператор END указывает конец тела программы.
Влюбые части программы на PL/SQL можно включать комментарии. Текст, который начинается с символов «–» и продолжается до конца текущей строки, рассматривается как комментарий. Строка, начинающаяся с ключевого слова RЕМ, также рассматривается как комментарий.
Вблоке программы PL/SQL, ограниченном операторами DECLARE и BEGIN, описываются переменные и константы. Любая переменная или константа должна иметь один из допустимых в Oracle типов. Константа идентифицируется ключевым словом CONSTANT и отличается от переменной тем, что попытка изменить ее значение приводит к сообщению об ошибке. Присваивание значений переменным осуществляется оператором «: =».
Рассмотрим пример простейшей программы, в которой определяются переменные и выполняются действия по вычислению ЕХР(2) и ЕХР(З). Команды установки переменных окружения SERVEROUTPUT и ECHO определяют режим вывода на терминал пользователя. Системная процедура DBMS_OUTPUT.PUT_LINE обеспечивает вывод данных на терминал пользователя, а функция ЕХР вычисляет экспоненту. Символ «/» указывает на завершение текста процедуры и является командой к интерпретации и выполнению процедуры.
48
Пример 4.15.
SQL>set serveroutput on; SQL>set echo on; SQL>DECLARE Headerl CONSTANT VARCHAR2(20):=’кспонента двух равна’; Header2 CONSTANT VARCHAR2(20):=’Экспонента трёх равна’; Arg NUMBER:=2; – здесь задаётся начальное значение аргумента
BEGIN
DBMS_OUTPUT.PUT_LINE(Headerl || Exp(Arg)); Arg:=Arg+l; DBMS_OUTPUT.PUT_LINE(Header2 || Exp(Arg)); END;
4.3. УПРАВЛЕНИЕ ВЫПОЛНЕНИЕМ ПРОГРАММЫ
ОПЕРАТОР ВЕТВЛЕНИЯ IF
В PL/SQL предусмотрено несколько операторов, с помощью которых можно управлять выполнением программы. Oracle использует следующий синтаксис конструкции ветвления в PL/SQL:
IF условие1 THEN |
|
|
|
операторы1; |
– ветвь 1 [ELSIF условиеK THEN |
||
операторыK;] |
– |
ветвь K [ELSE |
|
операторыN;] |
– |
ветвь альтернативы |
|
— |
операторы альтернативы |
||
END IF;
ОПЕРАТОР ВЕТВЛЕНИЯ CASE
При большом количестве ветвлений и/или необходимости присваивания значений удобно применить оператор CASE:
– простой оператор CASE: CASE выражение
WHEN результат1 THEN значение1 WHEN результатK THEN значениеK [ELSE] значениеN
END CASE;
– поисковый оператор CASE:
CASE
WHEN выражение1 THEN значение1
WHEN выражение2 THEN значение2
. . .
WHEN выражениеN THEN значениеK [ELSE] значениеN
END CASE;
49
– выражения CASE – используются внутри выражений, когда нужно присвоить значение.
Синтаксис:
Простое_выражение_CASE:= CASE выражение WHEN результат1 THEN значение1
. . .
WHEN результатK THEN значениеK [ELSE] значениеN
END;
Поисковое_выражение_CASE:= CASE WHEN выражение1 THEN значение1 WHEN выражение2 THEN значение2
. . .
WHEN выражениеN THEN значениеK [ELSE] значениеN
END;
Пример 4.16.
DECLARE
RobertCDnum NUMBER(2); RobertCDname VARCHAR2(64); BEGIN
RobertCDnum:=&INPUT_DATA; RobertCDname := CASE
RobertCDnum
WHEN 1 THEN ‘Shine’
WHEN 2 THEN ‘Princesse de Rien’
WHEN 3 THEN ‘Celle qui tue’
WHEN 4 THEN ‘Unutma (Noublie pas)’
ELSE ‘Not yet’
END;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(RobertCDnum) ||
RobertCDname);
END;
ОПЕРАТОР ЦИКЛА
В PL/SQL есть три типа оператора цикла: LOOP, FOR LOOP, WHILE
LOOP:
LOOP
Операторы
EXIT [WHEN условие];
END LOOP;
Последовательность операторов между LOOP и END LOOP многократно повторяется до тех пор, пока условие не примет значение TRUE. Условие мо-
50
жет принимать одно из трёх значений: TRUE, FALSE, NULL. Этот оператор выполняется, по крайней мере, хотя бы один раз, если будет отсутствовать EXIT, то последовательность операторов будет выполняться бесконечно. Если условие принимает значение TRUE, то будет выполняться следующий за LOOP оператор.
FOR counter IN [REVERSE] lower_bound .. upper_bound LOOP
Оператор1.; ОператорK;
END LOOP;
REVERSE означает изменение параметра цикла от верхней границы до нижней границы, при этом нижняя граница в операторе цикла опять стоит первой. Объявлять параметр цикла counter в операторе DECLARE нет необходимости, он по умолчанию объявляется как целый, lower_bound – нижняя граница изменения параметра цикла, upper_bound – верхняя граница изменения параметра цикла.
WHILE условие LOOP
Оператор1; ОператорK;
END LOOP;
Последовательность операторов между LOOP и END LOOP повторяется до тех пор, пока условие имеет значение TRUE. Условие проверяется до выполнения последовательности операторов, если условие принимает значение FALSE, то последовательность операторов перестает выполняться. Этот оператор может ни разу не проработать, если условие перед выполнением оператора имеет значение FALSE.
МЕТКИ
Метки следует использовать для структурирования программы и более гибкого управления выходом из вложенных циклов.
Синтксис метки: <<имя_метки>>
Например:
<<All_emp>>
FOR emp_rec IN emp_cur LOOP
. . . .
END LOOP All_emp;
Упражнения
Используя три формы цикла, вычислить и вывести число, факториал которого является наименьшим числом, большим заданной константы (например,
51
