38. Операторы языка хранимых процедур, функций и триггеров
38.1. BREAK
Оператор BREAK осуществляет выход из цикла WHILE или FOR.
Код продолжает выполняться с первого оператора после прерванного цикла.
Синтаксис оператора:
Листинг 38.1 Синтаксис оператора BREAK
[<метка>:]
<оператор цикла>
BEGIN
...
BREAK;
...
END
<оператор цикла> ::=
FOR <оператор SELECT> INTO <список переменных> DO
| FOR EXECUTE STATEMENT ... INTO <список переменных> DO
| WHILE (<логическое условие>) DO
38.2. CLOSE
Закрывает набор данных, связанный с данным курсором.
Листинг 38.2 Синтаксис оператора CLOSE
CLOSE <имя курсора>;
Курсор с таким именем должен быть предварительно объявлен с помощью оператора DECLARE CURSOR.
См. также операторы FETCH, OPEN, DECLARE CURSOR.
38.3. CONTINUE
Оператор CONTINUE моментально начинает новую итерацию внутреннего цикла операторов WHILE или FOR.
С использованием опционального параметра метки CONTINUE также может начинать новую итерацию для внешних циклов. Синтаксис оператора:
Листинг 38.3 Синтаксис оператора CONTINUE
CONTINUE [<метка>];
38.4. DECLARE CURSOR
Для объявления локальной переменной - курсора используется следующий вариант синтаксиса оператора DECLARE VARIABLE:
Листинг 38.4 Синтаксис оператора объявления курсора DECLARE VARIABLE
DECLARE [VARIABLE] <имя курсора>
[SCROLL | NO SCROLL] CURSOR
FOR (<оператор SELECT>);
Этот оператор объявляет именованный курсор, связывая его с набором данных, полученным в операторе SELECT, указанном в предложении CURSOR FOR.
В дальнейшем курсор может быть открыт, использоваться для обхода результирующего набора данных, и снова быть закрытым.
Также поддерживаются позиционированные обновления и удаления при использовании WHERE CURRENT OF в операторах UPDATE и DELETE.
Имя курсора можно использовать в качестве ссылки на курсор, как на переменные типа запись.
Текущая запись доступна через имя курсора, что делает необязательным предложение INTO в операторе FETCH.
Курсор может быть однонаправленными прокручиваемым. Необязательное предложение SCROLL делает курсор двунаправленным (прокручиваемым),
предложение NO SCROLL - однонаправленным. По умолчанию курсоры являются однонаправленными.
Однонаправленные курсоры позволяют двигаться по набору данных только вперёд.
Двунаправленные курсоры позволяют двигаться по набору данных не только вперёд, но и назад, а также на N позиций относительно текущего положения.
Особенности использования курсора:
Предложение
FOR UPDATEразрешено использовать в оператореSELECT, но оно не требуется для успешного выполнения позиционированного обновления или удаления.Удостоверьтесь, что объявленные имена курсоров не совпадают, ни с какими именами, определёнными позже в предложениях
AS CURSOR.Если курсор требуется только для прохода по результирующему набору данных, то практически всегда проще (и менее подвержено ошибкам) использовать оператор
FOR SELECTс предложениемAS CURSOR. Объявленные курсоры должны быть явно открыты, использованы для выборки данных и закрыты. Кроме того, вы должны проверить контекстную переменнуюROW_COUNTпосле каждой выборки и выйти из цикла, если её значение ноль. ПредложениеFOR SELECTделает эту проверку автоматически. Однако объявленные курсоры дают большие возможности для контроля над последовательными событиями и позволяют управлять несколькими курсорами параллельно.Оператор
SELECTможет содержать параметры, например:SELECT NAME || :SFX FROM NAMES WHERE NUMBER = :NUM. Каждый параметр должен быть заранее объявлен как переменнаяPSQL(это касается также входных и выходных параметров). При открытии курсора параметру присваивается текущее значение переменной.Если опция прокрутки опущена, то по умолчанию принимается
NO SCROLL(т.е курсор открыт для движения только вперёд). Это означает, что могут быть использованы только командыFETCH [NEXT FROM]. Другие команды будут возвращать ошибки.
См. также операторы OPEN, CLOSE, FETCH, DECLARE VARIABLE.
38.5. DECLARE FUNCTION
В хранимых функциях и хранимых процедурах можно объявлять подфункции. Синтаксис оператора:
Листинг 38.5 Синтаксис оператора объявления подфункции DECLARE FUNCTION
DECLARE FUNCTION <имя подфункции>
[(<входной параметр> [, <входной параметр> ...])]
RETURNS <тип> [COLLATE <сортировка>] [DETERMINISTIC]
AS
[<объявление лок.переменных/курсоров>[<объявление лок.переменных/курсоров>...] ]
BEGIN
<блок операторов>
END
Подфункция не может быть вложена в другую подпрограмму. Они поддерживаются только в основном модуле (хранимой процедуре, хранимой функции и анонимном PSQL блоке).
В настоящее время подфункция не имеет прямого доступа для использования переменных, курсоров и других подпрограмм из основного модуля. Это может быть разрешено в будущем.
Одна подпрограмма может вызывать и другую подпрограмму, в том числе рекурсивно. В ряде случаев может потребоваться предварительное объявление подпрограммы. Общее правило: одна подпрограмма может вызвать другую подпрограмму, если последняя объявлена выше точки вызова. Все объявленные подпрограммы должны быть реализованы с той же сигнатурой. Значения по умолчанию для параметров подпрограмм не могут быть переопределены. Это означает, что они могут быть определены в реализации только тех подпрограмм, которые не были объявлены ранее
См. также операторы DECLARE VARIABLE, DECLARE PROCEDURE.
38.6. DECLARE PROCEDURE
В хранимых функциях и хранимых процедурах можно объявлять подпроцедуры. Синтаксис оператора:
Листинг 38.6 Синтаксис оператора объявления подпроцедуры DECLARE PROCEDURE
DECLARE PROCEDURE <имя подпроцедуры>
[(<входной параметр> [, <входной параметр> ...])]
[RETURNS (<выходной параметр> [, <выходной параметр> ...])]
AS
[<объявление лок.переменных/курсоров>[<объявление лок.переменных/курсоров>...] ]
BEGIN
<блок операторов>
END
Подпроцедура не может быть вложена в другую подпрограмму. Они поддерживаются только в основном модуле (хранимой процедуре, хранимой функции и анонимном PSQL блоке). В настоящее время подпроцедура не имеет прямого доступа для использования переменных, курсоров и других подпрограмм из основного модуля. Это может быть разрешено в будущем. Одна подпрограмма может вызывать и другую подпрограмму, в том числе рекурсивно. В ряде случаев может потребоваться предварительное объявление подпрограммы. Общее правило: одна подпрограмма может вызвать другую подпрограмму, если последняя объявлена выше точки вызова. Все объявленные подпрограммы должны быть реализованы с той же сигнатурой. Значения по умолчанию для параметров подпрограмм не могут быть переопределены. Это означает, что они могут быть определены в реализации только тех подпрограмм, которые не были объявлены ранее.
См. также операторы DECLARE VARIABLE, DECLARE FUNCTION.
38.7. DECLARE VARIABLE
Оператор позволяет определить локальную переменную или курсор.
Листинг 38.7 Синтаксис оператора объявления подпроцедуры DECLARE VARIABLE
DECLARE [VARIABLE] {
<имя локальной переменной> <тип>
[NOT NULL]
[COLLATE <порядок сортировки>]
[{ = | DEFAULT } <значение по умолчанию>]
| <имя курсора> [SCROLL | NO SCROLL] CURSOR FOR (<оператор SELECT>) }
<тип> ::= {
<тип данных SQL>
| [TYPE OF] <имя домена>
| TYPE OF COLUMN <имя таблицы/представления>.<имя столбца> }
<значение по умолчанию>::= {<литерал> | NULL | <контекстная переменная>}
Имя переменной должно быть уникальным среди всех имен локальных переменных, имен входных и выходных параметров данного программного объекта.
Типом данных может быть любой тип данных, используемый в SQL.
Вместо типа данных можно указать имя домена. В этом случае переменной присваиваются все характеристики домена — запрет пустого значения (NOT NULL),
значение по умолчанию (DEFAULT) и условие (CHECK), которому должно удовлетворять значение, помещаемое в переменную.
В случае задания в операторе предложения TYPE OF для этой переменной из домена копируется лишь тип данных.
Локальные переменные можно объявлять, используя тип данных столбцов существующих таблиц и представлений.
Для этого используется предложение TYPE OF COLUMN, после которого указывается имя таблиц или представления и через точку имя столбца.
При использовании TYPE OF COLUMN наследуется только тип данных, а в случае строковых типов ещё набор символов и порядок сортировки.
Ограничения и значения по умолчанию столбца никогда не используются.
Для локальных переменных можно указать ограничение NOT NULL, тем самым запретив передавать в него значение NULL.
Для строкового типа данных также можно задать порядок сортировки (предложение COLLATE).
Локальной переменной можно устанавливать инициализирующее (начальное) значение.
Это значение устанавливается с помощью предложения DEFAULT или оператора =.
В качестве значения по умолчанию может быть использовано значение NULL, литерал и любая контекстная переменная совместимая по типу данных.
При помощи оператора DECLARE VARIABLE также можно объявить курсор - специфическую переменную, связанную с выбираемым из базы данных набором данных.
Получаемый набор данных определяется оператором SELECT, который следует после ключевых слов CURSOR FOR и заключается в круглые скобки.
См. также операторы OPEN, CLOSE, FETCH, DECLARE CURSOR.
38.8. EXCEPTION
Выдает указанное пользовательское исключение базы данных. При возбуждении исключения можно также указать альтернативный текст сообщения, который заменит текст сообщения заданным при создании исключения.
Листинг 38.8 Синтаксис оператора EXCEPTION
EXCEPTION <имя пользовательского исключения> [<текст сообщения> | USING (<значение> [,<значение>...])];
Оператор EXCEPTION возбуждает пользовательское исключение с указанным именем.
При возбуждении исключения можно также указать альтернативный текст сообщения, который заменит текст сообщения заданным при создании исключения.
Текст сообщения исключения может содержать слоты для параметров, которые заполняются при возбуждении исключения.
Для передачи значений параметров в исключение используется предложение USING.
Параметры рассматриваются слева направо. Каждый параметр передаётся в оператор возбуждающий исключение как N-ый, N начинается с 1:
Если
N-ыйпараметр не передан, его слот не заменяется;Если передано значение
NULL, слот будет заменён на строку'***null***';Если количество передаваемых параметров будет больше, чем содержится в сообщении исключения, то лишние будут проигнорированы;
Максимальный номер параметра равен 9;
Общая длина сообщения, включая значения параметров, ограничена 1053 байтами.
CREATE EXCEPTION ex1 'something wrong in @1';
set term !;
EXECUTE BLOCK AS
BEGIN
EXCEPTION ex1 USING ('the text');
END!
set term ;!
Исключение может быть обработано в операторе WHEN-DO. Если пользовательское исключение не было обработано в триггере или в хранимой процедуре или функции,
то все выполненные действия отменяются, вызвавшая программа получает текст, заданный при создании исключения.
См. также операторы CREATE EXCEPTION, ALTER EXCEPTION, DROP EXCEPTION, WHEN-DO.
38.9. EXIT
Оператор EXIT позволяет из любой точки триггера или хранимой процедуры или функции перейти на конечный оператор END, то есть завершить выполнение программы.
Листинг 38.9 Синтаксис оператора EXIT
EXIT;
38.10. FETCH
Оператор FETCH читает очередную запись набора данных, связанного с курсором. Синтаксис оператора:
Листинг 38.10 Синтаксис оператора FETCH
FETCH <имя курсора>
[INTO :<внутренняя переменная> [, :<внутренняя переменная>]... ];
FETCH {
NEXT
| PRIOR
| FIRST
| LAST
| ABSOLUTE <n>
| RELATIVE <n>
} FROM <имя курсора> [INTO [:]<внутр. переменная> [,[:]<внутр. переменная>...]];
Оператор FETCH применим только к курсорам, объявленным в операторе DECLARE VARIABLE.
Оператор читает очередную строку, полученную при выполнении оператора SELECT, связанного с данным курсором,
и помещает полученные данные во внутренние переменные программы (предложение INTO). Предложение INTO можно не указывать в том случае,
если для полученной строки будет использован оператор удаления данных DELETE.
В новой версии оператора FETCH можно указывать в каком направлении и на сколько записей продвинется позиция курсора.
Предложение NEXT указывает, что указатель курсора должен продвинуться на 1 запись вперёд.
Это предложение допустимо использовать как с прокручиваемыми, там и не прокручиваемыми курсорами.
Остальные предложения допустимо использовать только с прокручиваемыми курсорами. Предложение PRIOR указывает, что указатель курсора должен продвинуться на 1 запись назад.
Предложение FIRST позволяет переместить позицию курсора на первую запись, а предложение LAST - на последнюю.
Предложение ABSOLUTE позволяет указать номер позиции, на которую будет установлен курсор.
Номер позиции должен быть в диапазоне от 1 до максимального количества записей извлекаемых запросом курсора.
Предложение RELATIVE позволяет указать, на какое количество записей относительно текущей позиции необходимо переместить указатель курсора.
Если указано положительное число, то курсор перемещает вперёд на N позиций, если отрицательное, то назад.
Позволяется использовать ссылки на курсоры, как на переменные типа запись. Текущая запись доступна через имя курсора.
Для разрешения неоднозначности при доступе к переменной курсора перед именем курсора необходим префикс двоеточие;
К переменной курсора можно получить доступ без префикса двоеточия, но в этом случае, в зависимости от области видимости контекстов, существующих в запросе, имя может разрешиться как контекст запроса вместо курсора;
Переменные курсора доступны только для чтения;
Чтение из переменной курсора возвращает текущие значения полей. Это означает, что оператор
UPDATE(с предложениемWHERE CURRENT OF) обновит также и значения полей в переменной курсора для последующих чтений. Выполнение оператораDELETE(с предложениемWHERE CURRENT OF) установитNULLдля значений полей переменной курсора для последующих чтений.
Для проверки того, что записи набора данных исчерпаны, используется контекстная переменная ROW_COUNT, которая возвращает количество считанных оператором строк.
Если произошло чтение очередной записи из набора данных, то ROW_COUNT равняется единице, иначе нулю.
См. также операторы OPEN, CLOSE, DECLARE VARIABLE, WHEN-DO, описание контекстной переменной ROW_COUNT.
38.11. FOR EXECUTE STATEMENT
Оператор FOR EXECUTE STATEMENT является оператором цикла. Синтаксис оператора представлен в следующем листинге:
Листинг 38.11 Синтаксис оператора FOR EXECUTE STATEMENT
[<метка>:]
[FOR] EXECUTE STATEMENT <строковое выражение>
[ON EXTERNAL [DATA SOURCE] <спецификация файла> ]
[WITH {AUTONOMOUS | COMMON } TRANSACTION ]
[AS USER <имя пользователя>]
[PASSWORD <пароль>]
[CERTIFICATE <алиас сертификата>]
[PIN <пароль>]
[ROLE <роль>]
[WITH CALLER PRIVILEGES]
[INTO [:] <внутренняя переменная> [, [:] <внутренняя переменная>...] ]
[DO <составной оператор>]
<строковое выражение> ::= {
<Строки или переменная, содержащая не параметризованный SQL запрос>
| (<Строки или переменная, содержащая не параметризованный SQL запрос>)
| (<Строки или переменная, содержащая параметризованный SQL запрос>) ({ <именованные параметры> | <позиционные параметры> }) }
<именованные параметры> ::= [EXCESS] <имя параметра>:=<выражение>
[, [EXCESS] <имя параметра>:=<выражение> ...]
<позиционные параметры> ::= <выражение> [, <выражение> ...]
<спецификация файла> ::=
[<спецификация удалённого сервера>] { <путь к файлу БД> | <алиас БД> }
<спецификация удалённого сервера> ::=
<хост>[\<порт> | <имя сервиса>]:
| \\<хост>[@<порт> | <имя сервиса>]\
| <протокол>://[ <имя сервиса>[: <порт> | <имя сервиса>]/]
<протокол> = inet | inet4 | inet6 | xnet
В этом операторе "строковое выражение" — любое выражение, возвращающее строку символов.
Выражение может быть внутренней переменной, значением, получаемым конкатенацией двух или более строк, строковым литералом, заключенным в апострофы, и т.д.
Содержанием этого выражения должен быть правильный оператор SELECT, обращающийся к таблице, представлению или к хранимой процедуре выбора для получения данных.
Данные, полученные из оператора SELECT, при помощи обязательного предложения INTO помещаются во внутренние переменные.
Именам внутренних переменных в этом предложении должны предшествовать символы двоеточия.
Для каждой считанной записи выполняется составной оператор, указанный после ключевого слова DO.
Цикл повторяется, пока не будут прочитаны все строки или пока не встретится оператор LEAVE. После этого происходит выход из цикла.
Более подробно об операторе EXECUTE STATEMENT изложено в разделе 17.16 "Оператор FOR EXECUTE STATEMENT".
Пример использования оператора FOR EXECUTE STATEMENT представлен в примере, в котором выполняются те же действия, что и в операторе FOR SELECT-DO:
DECLARE VARIABLE STMT1 CHAR(100);
...
STMT1 = 'SELECT CODCOUNTRY, CODREGION, NAMEREG, CENTER FROM VIEW_RUSSIA2';
FOR EXECUTE STATEMENT STMT1
INTO :CODCOUNTRY, :CODREGION, :NAMEREG, :CENTER
DO
BEGIN
EXECUTE PROCEDURE PROC_N(CODCOUNTRY, CODREGION, NAMEREG, CENTER)
RETURNING_VALUES RESULT;
SUSPEND;
END
Здесь для формирования оператора SELECT используется локальная переменная STMT1 строкового типа.
Ей присваивается соответствующее значение. После этого выполняется оператор FOR EXECUTE STATEMENT,
который из представления VIEW_RUSSIA2 читает очередную строку таблицы регионов.
Данные прочитанной строки обрабатываются в процедуре PROC_N, после чего происходит временная приостановка выполнения процедуры и управление передается вызвавшей программе.
Когда будут прочитаны все строки, соответствующие условиям поиска в представлении VIEW_-RUSSIA2,
выполнение цикла будет завершено и управление перейдет к оператору, следующему за оператором цикла.
См. также операторы LEAVE, SUSPEND, EXIT, FOR SELECT-DO, WHILE-DO, WHEN-DO, EXECUTE BLOCK.
38.12. FOR SELECT-DO
Оператор FOR SELECT-DO является оператором цикла. Синтаксис оператора:
Листинг 38.12 Синтаксис оператора Синтаксис оператора FOR SELECT
[<метка>:]
FOR
<оператор SELECT>
[AS CURSOR <имя курсора>]
INTO [:]<имя переменной/параметра> [, [:]<имя переменной/параметра> ...]
DO <составной оператор>;
Оператор SELECT выбирает очередную строку из таблицы (представления, хранимой процедуры выбора), после чего выполняется составной оператор.
Оператор SELECT должен содержать предложение INTO, которое располагается в конце этого оператора.
Цикл повторяется, пока не будут прочитаны все строки. После этого происходит выход из цикла.
Цикл также может быть завершен до прочтения всех строк при использовании оператора LEAVE.
Необязательное предложение AS CURSOR создаёт именованный курсор, на который можно ссылаться (с использованием предложения WHERE CURRENT OF)
внутри оператора или блока операторов следующего после предложения DO, для того чтобы удалить или модифицировать текущую строку.
Над курсором, объявленным с помощью предложения AS CURSOR нельзя выполнять операторы OPEN, FETCH и CLOSE.
См. также операторы LEAVE, SUSPEND, EXIT, FOR EXECUTE STATEMENT, WHILE-DO, WHILE-DO, EXECUTE BLOCK.
38.13. IF-THEN-ELSE
Листинг 38.13 Синтаксис оператора IF-THEN-ELSE
IF (<условие>)
THEN <составной оператор>
[ELSE <составной оператор>];
Условием является обычное условие, которое может возвращать значения TRUE, FALSE или UNKNOWN.
Если условие возвращает значение TRUE, то выполняется составной оператор после ключевого слова THEN.
Иначе (если условие возвращает FALSE или UNKNOWN) выполняется составной оператор после ключевого слова ELSE, если присутствует.
Условие всегда заключается в круглые скобки.
Составной оператор — это одиночный оператор или блок операторов, заключенных в операторные скобки BEGIN и END.
См. также внутренние функции IIF, CASE-WHEN-ELSE, COALESCE.
38.14. LEAVE
Этот оператор выполняет выход из цикла WHILE или FOR независимо от выполнения условия в предложении WHILE.
Если же в операторе указана метка, то выполняется переход на начало другого (или того же самого) цикла. Синтаксис оператора:
Листинг 38.14 Синтаксис оператора LEAVE
LEAVE [<метка>];
Если в операторе не указана метка, то оператор просто осуществляет выход из текущего цикла WHILE.
Если в операторе LEAVE указана метка, то это должна быть метка, относящаяся к оператору WHILE, к оператору FOR SELECT или к оператору FOR EXECUTE STATEMENT.
При выполнении такого оператора LEAVE происходит переход к выполнению соответствующего циклического оператора.
38.15. OPEN
Оператор открывает курсор (читает данные), связанный с оператором SELECT, выбирающим данные из таблицы базы данных или из представления. Синтаксис оператора:
Листинг 38.15 Синтаксис оператора OPEN
OPEN <имя курсора>;
Оператор OPEN применим только к курсорам, объявленным в операторе DECLARE CURSOR.
38.16. POST_EVENT
Оператор посылает событие (сообщение) всем клиентским приложениям, подключенным в настоящий момент к базе данных, и «прослушивающим» данное событие.
Листинг 38.16 Синтаксис оператора POST_EVENT
POST_EVENT {
'<имя сообщения>'
| <имя столбца>
| :<внутренняя переменная> };
Это может быть явно заданный текст в виде строки символов, имя столбца, содержащего текст, или имя внутренней переменной (локальной переменной, входного или выходного параметра хранимой процедуры), которая содержит отправляемый текст сообщения. Имя события, ограничено 127 байтами.
См. также операторы CREATE EXCEPTION, ALTER EXCEPTION, EXCEPTION, DROP EXCEPTION, WHEN-DO.
38.17. SUSPEND
Оператор временно приостанавливает выполнение хранимой процедуры выбора и передает вызвавшей программе значения выходных параметров.
Когда вызвавшая программа выполняет после этого оператор FETCH (этот оператор неявно выдается при выполнении оператора SELECT),
работа процедуры возобновляется с оператора, следующего непосредственно за оператором SUSPEND.
Листинг 38.17 Синтаксис оператора SUSPEND
SUSPEND;
Если оператор SUSPEND выдается в выполняемой хранимой процедуре, то это равносильно выполнению оператора EXIT, в результате чего завершается работа процедуры.
38.18. WHEN-DO
Оператор используется для обработки ошибочных ситуаций и пользовательских исключений в языке хранимых процедур, функций и триггеров.
Оператор позволяет перехватить любые указанные ошибки базы данных и/или пользовательские исключения или вообще все возникшие ошибочные
ситуации или выданные пользовательские исключения (EXCEPTION) при обращении к базе данных.
Листинг 38.18 Синтаксис оператора WHEN-DO
WHEN { <ошибка> [, <ошибка> ...] | ANY }
DO <составной оператор>;
<ошибка> ::= {
SQLCODE <код ошибки SQLCODE>
| SQLSTATE <код ошибки SQLSTATE>
| GDSCODE <код ошибки GDSCODE>
| EXCEPTION <имя пользовательского исключения> }
Оператор должен находиться в самом конце блока операторов перед оператором END.
В условии оператора, до ключевого слова DO, задаются те ситуации, при которых будет выполняться составной оператор.
Здесь можно перечислить произвольное количество значений кодов SQLCODE, GDSCODE, имен пользовательских исключений или задать ключевое слово ANY,
которое означает, что обработка ситуации будет выполняться при появлении любой ошибки базы данных и/или любого пользовательского исключения.
После ключевого слова DO следует оператор или блок операторов, заключенных в операторные скобки BEGIN и END, которые выполняют некоторую обработку возникшей ситуации.
Оператор WHEN-DO вызывается только в том случае, если произошло одно из указанных в его условии событий.
В случае выполнения оператора (даже если в нем фактически не было выполнено никаких действий) ошибка или пользовательское исключение
не прерывает и не отменяет действий триггера или хранимой процедуры или функции, где был выдан этот оператор, работа продолжается,
как если бы никаких исключительных ситуаций не было. Оператор перехватывает ошибки и исключения в текущем блоке операторов.
Он также перехватывает подобные ситуации во вложенных блоках, если эти ситуации не были в них обработаны.
См. также операторы FOR SELECT-DO, FETCH, EXCEPTION, WHILE-DO, FOR EXECUTE STATEMENT, EXECUTE BLOCK.
38.19. WHILE-DO
Оператор позволяет организовать в PSQL цикл. Синтаксис оператора представлен в следующем листинге:
Листинг 38.19 Синтаксис оператора WHILE-DO
[<метка>:]
WHILE (<условие>) DO
<составной оператор>
Составной оператор будет выполняться в цикле, пока условие возвращает значение TRUE. Циклы могут быть вложенными, глубина вложения не ограничена.
См. также операторы IF-THEN-ELSE, LEAVE, FOR SELECT-DO, WHEN-DO, EXECUTE BLOCK, внутренние функции IIF, CASE-WHEN-ELSE, COALESCE.