Базовая структура блока

Каждый блок состоит из трех различных разделов: раздела объявлений, выполняемого раздела и раздела исключительных ситуаций. Обязателен только выполняемый раздел; два других необязательны.

В разделе объявлений размещаются объявления всех переменных, курсоров и типов, используемых данным блоком. В этом разделе могут быть объявлены также локальные процедуры и функции. Такие подпрограммы будут доступны только в пределах блока. В выполняемом разделе осуществляется работа блока. В этом разделе могут находиться как процедурные, так и SQL-операторы. Ошибки обрабатываются в разделе исключительных ситуаций.

Общий вид записи блока:

 

DECLARE /* Раздел объявлений */ BEGIN /* Выполняемый раздел */ EXCEPTION /* Раздел исключительных ситуаций */ END;

 

Объявление переменных

В блоках PL/SQL взаимодействие с базой данных осуществляется посредством переменных. Переменные (variables) — это области памяти, в которых могут храниться некоторые значения данных. По мере выполнения программы содержимое переменных модифицируется. Переменной может быть присвоена определенная информация, хранимая в базе данных, либо содержимое переменной может быть внесено в базу данных. Переменные могут изменяться непосредственно командами PL/SQL. Переменные определяются в разделе объявлений блока. Каждая переменная имеет конкретный тип, описывающий тип хранящейся в ней информации.

Переменные определяются в разделе объявлений блока. Общий синтаксис объявления переменных:

 

имя_переменной тип [CONSTANT] [NOT NULL] [:= значение};

 

где имя_переменной — это имя переменной, тип — это тип, а значение — начальное значение переменной. Ниже приведены примеры корректного объявления переменных:

DECLARE v_Description VARCHAR2(50); v_NuinberSeats NUMBER:= 45;               v_Counter BINARY_INTEGER:= 0;

Присваивание

Основной операцией является операция присваивания (assignment). Ее синтаксис таков:

переменная:= выражения;

где переменная — это переменная PL/SQL, а выражение — это выражение PL/SQL. Данная операция может производиться в выполняемом разделе и в разделе исключительных ситуаций блока. Ниже приводится ряд примеров использования операции присваивания:

 

DECLARE v_String1 VARCHAR2(10); v_String2 VARCHAR2(15); v_Numeric NUMBER; BEGIN v_String1:= 'Hello'; v_Strlng2:= v_String1; v_Numeric:= -12.4; END; /

 

Величина, находящаяся в левой части операции присваивания, называется именующим значением (lvalue), а величина, находящаяся в правой части, — значением выражения (rvalue). Именующее значение должно ссылаться на некоторую реальную область памяти, так как в нее будет записываться значение выражения.

Символьные выражения

Существует лишь одна символьная операция — операция конкатенации, или сцепления (| |). С ее помощью соединяются две или большее количество символьных строк (или аргументов, которые могут быть неявно преобразованы в символьные строки). Например, результатом выражения

 

'Hello'||'World'||'!'

 

будет

 

'Hello World!'

 

Если все операнды в выражении конкатенации имеют тип CHAR, то и оно само будет иметь тип CHAR. Если же хотя бы один операнд имеет тип VARCHAR2, выражение будет иметь тип VARCHAR2. Считается, что строковые литералы имеют тип CHAR, поэтому результатом предыдущего примера является значение типа CHAR. Однако в следующем блоке переменной v_Result присваивается выражение, результат которого - значение типа VARCHAR2:

 

DECLARE v_TempVar VARCHAR2(10):= 'PL'; v_Result   VARCHAR2(20); BEGIN v_Result:= v_TempVar END; /

Логические выражения

Во всех управляющих структурах PL/SQL (за исключением GOTO) используются логические выражения, называемые также условиями. Логическое, или булево, выражение — это любое выражение, которое дает в результате логическое значение (TRUE (истина), FALSE (ложь) или NULL).

NULL-значения усложняют логические выражения (NULL — это пропущенное или неизвестное значение). Результатом выражения «TRUE AND NULL» является NULL, так как неизвестно, истинен ли второй операнд.

Оператор IS NULL возвращает значение TRUE только тогда, когда операндом является NULL. NULL-значения не могут быть проверены на истинность при помощи операций отношения, так как любое выражение отношения, операндом которого является NULL, возвращает NULL.

Оператор LIKE (подобие) применяется для сопоставления строк сим волов с некоторым образцом, подобно тому, как это делается в регулярных выражениях системы Unix. Знак подчеркивания (_) соответствует одному символу, а знак процента (%) — нулю и более символам. Приведенные ниже выражения возвращают TRUE:

 

'Иванов' LIKE 'Ив%в' 'Иванов' LIKE 'Ива_ов' 'Иванов' LIKE '%'

 

Оператор BETWEEN (между) объединяет операции <= и >= в одном выражении. Например, приведенное ниже выражение возвращает значение FALSE:

 

100 BETWEEN 110 AND 120

 

А это выражение возвращает TRUE:

 

100 BETWEEN 90 AND 110

 

Оператор IN (в) возвращает TRUE, если первый операнд содержится в наборе, определяемом вторым операндом. Например, результат этого выражения - FALSE:

 

'Иванов' IN ('Петров', 'Сидоров')

 

Если в наборе содержатся NULL-значения, они игнорируются, так как при сравнении некоторого значения с NULL всегда будет возвращаться NULL.

 

Управляющие структуры PL/SQL

В PL/SQL, как и в других языках программирования третьего поколения, имеются различные структуры, служащие для управления работой блока. Этими структурами являются условные операторы и циклы. Именно эти структуры совместно с переменными обеспечивают мощь и гибкость PL/SQL.

IF-THEN-ELSE

Синтаксис оператора IF-THEN-ELSE (если-то-иначе):

IF логическое_выражение1 THEN последователъностъ_операторов1; ELSIF логическое_выражение2 THEN последователъностъ_операторов2; ELSE последов ателъностъ_оператаровЗ; END IF;

 

где логическое_выражение – любое выражение, результатом которого является логическое значение. Условия ELSIF и ELSE необязательны, причем условий ELSIF может быть сколь угодно много. Например, ниже представлен блок, демонстрирующий использование оператора IF-THEN-ELSE с одним условием ELSIF и с одним условием ELSE:

 

DECLARE v_Number NUMBER; v_Comment VARCHAR2(35); BEGIN /* Извлекаем количество записей в temp_table. Сохраняем результат в v_Number. */ SELECT count(*) INTO v_Number FROM temp_table; IF v_Number < 50 THEN v_Comment:= 'Меньше 50'; ELSIF v_Number < 100 THEN v_Comment:= 'Меньше 100'; ELSE v_Comment:= 'Больше 100'; END IF; END; /

Циклы

В PL/SQL можно повторять операторы посредством циклов (loops). Циклы подразделяются на три категории. Простые циклы, циклы WHILE и циклы FOR.

Простые циклы

Синтаксис простых циклов (основных циклов языка) таков:

LOOP последователъностъ_операторов; END LOOP;

 

Последовательность операторов будет выполняться бесконечно долго, так как в этом цикле отсутствует условие его завершения. Такое условие можно предусмотреть, если добавить оператор EXIT (выход), имеющий следующий синтаксис: EXIT [WHEN условие]

Рассмотрим блок, с помощью которого в таблицу temp_table вводится 50 строк:

 

DECLARE     v_Counter BINARY_INTEGER:= 1; BEGIN     LOOP     /* Введем в таблицу temp_table строку с текущим значением     счетчика цикла.*/               INSERT INTO temp_table               VALUES (v_Counter, 'LOOP index');               v_Counter:= v_Counter + 1;     -- Условие выхода: когда счетчик цикьс: станет > 50, цикл будет завершен.         IF v_Counter > 50 THEN EXIT; END IF;     END LOOP; END;

 

Строку «IF v_Counter > 50 THEN EXIT; END IF» можно заменить на эквивалентyю «EXIT WHEN v_Counter > 50».

 

Циклы WHILE

Синтаксис цикла WHILE (цикл с условием продолжения) таков:

WHILE условие LOOP     последователъностъ_ операторов; END LOOP;

 

Проверка условия происходит перед каждой итерацией (шагом) цикла. Если условие истинно, выполняется последовательность операторов. Если же проверка условия дает ложное или NULL-значение, цикл завершается и управление программой передается оператору, следующему за оператором END LOOP. Теперь перепишем рассматриваемый блок, применив цикл WHILE:

 

DECLARE     v_Counter BINARY_INTEGER:= 1; BEGIN /* Проверяем счетчик цикла перед каждой итерацией - на предмет того, что значение счетчика меньше 50.*/     WHILE v_Counter <= 50 LOOP               INSERT INTO temp_table               VALUES (v_Counter, 'Loop index');               v_Counter;= v_Counter + 1;     END LOOP; END;

 

Чтобы прервать цикл и выйти из него, можно внутри цикла WHILE использовать оператор EXIT или EXIT WHEN. Учтите, что если при первой проверке условие цикла не истинно, цикл не выполняется ни разу.

 

Числовые циклы FOR

Число итераций в простых циклах и циклах WHILE не известно заранее — оно зависит от условий, заданных в циклах. В числовых же циклах FOR число итераций заранее определено. Синтаксис цикла FOR таков:

FOR счетчик_цикла IN [REVERSE] нижняя_гранииа.. верхняя_граница)ОР     последоватеяъностъ_ операторов; END LOOP;

 

где счетчик_цикла – неявно создаваемая индексная переменная, нижняя_граница и верхняя_граница указывают число итераций, а последователъностъ_операторов — это содержимое цикла.

Границы цикла вычисляются один раз и определяют общее число итераций, проходимых счетчиком цикла от нижней границы до верхней границы. При этом счетчик каждый раз увеличивается на 1 до тех пор, пока цикл не завершится. Представим наш пример с помощью цикла FOR:

 

BEGIN     FOR v_Counter IN 1..50 LOOP               INSERT INTO temp_table               VALUES (v_Counter, 'Loop Index');     END LOOP; END;

 

Если в цикле FOR указывается ключевое слово REVERSE (обратный порядок), индекс цикла будет изменяться от верхней границы до нижней. Обратите внимание, что в этом случае синтаксис остается прежним — нижняя граница по-прежнему указывается первой.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: