Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными. Использование технологий ORACLE для реализации баз данных. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
722 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]