Шрифт:
Интервал:
Закладка:
Да
Да
переменная = выражение
Присваивает значение выражения переменной- локальной переменной, входному параметру или выходному параметру
Да
Да
/* текст комментария */
Комментарий программиста, где текст может содержать любое количество строк между парой /* */. Может быть также использован для встроенных комментариев
Да
Да
-- текст комментария
Комментарий программиста из одной строки, где текст может быть встроенным (только версия 1.5) или может занимать одну строку, где маркер двойного минуса (-) является первым элементом в строке
Да
Да
EXCEPTION имя-исключения
Вызывает именованное исключение для возможной обработки в блоке WHEN. Само исключение должно быть предварительно определено администратором базы данных с использованием CREATE EXCEPTION
Да
Да
EXCEPTION
Вызывает исключение
Да
Нет
EXCEPTION имя-исключения сообщение-времени-выполнения
Вызывает именованное исключение и присоединяет к нему сообщение времени выполнения - локальную переменную типа VARCHAR, которой во время выполнения может быть присвоено значение. Подробности определения и использования исключений см. в главе 32
Да
Нет
EXECUTE PROCEDURE имя-процедуры [переменная [, переменная ...]] [ RETURNING_VALUES переменная [, переменная. . .]]
Выполняет хранимую процедуру имя- процедуры. Входные аргументы следуют за именем процедуры; возвращаемые значения следуют за ключевым словом RETURNING VALUES. Допустимы вложенные процедуры и рекурсия. Входные и выходные параметры должны быть переменными, определенными в процедуре
Да
Да
EXECUTE STATEMENT <строка>
Выполняет оператор динамического SQL, содержащийся в <строка>
Да
Нет
EXIT
Переходит на конечный оператор END. Необязателен
Да
Да
FOR ... SELECT ... INTO ... DO
Синтаксис составного блока цикла для обработки неявного курсора и (необязательной) генерации виртуальной таблицы для направления выхода запроса SELECT клиенту. Подробности см. в разд. "SELECT для множества строк"
Да
Да
IF . . . THEN .. . [ELSE] ...
Синтаксис составного ветвления. Подробности см. в разд. "Условные блоки" позже в этой главе
Да
Да
LEAVE[114]
Оператор не принимает параметров. Используется для выхода из цикла. Выполнение переходит к первому оператору, следующему за концом того блока, который включает цикл, где был выполнен оператор LEAVE
Да
Нет
NEW. имя-столбца
Только триггеры. Контекстные переменные, доступные для триггеров INSERT и UPDATE. Существует одна переменная NEW для каждого столбца таблицы, содержащая новое значение, передаваемое клиентским запросом. Также доступна в некоторых ограничениях CHECK. Заметим, что в версии 1.5 в триггерах для нескольких действий ссылка на NEW. переменная не является ошибкой, поскольку она вернет NULL, если используется в контексте удаления
Да
Да
OLD.имя-столбца
Только триггеры. Контекстные переменные, доступные для триггеров INSERT и DELETE. Существует одна переменная OLD для каждого столбца таблицы, содержащая значение, которое имел столбец до выдачи клиентского запроса. Также доступна в некоторых ограничениях CHECK. Заметим, что в версии 1.5 в триггерах для нескольких действий ссылка на OLD.переменная не является ошибкой, даже если триггер включает действия по добавлению данных. Она вернет NULL, если используется в контексте добавления
Да
Да
POST_EVENT имя-события
Помещает событие имя-события в стек. Имя события может быть произвольной строкой длиной до 78 символов и не является предварительно определенным на сервере. События из стека будут переданы клиентам, "прослушивающим" это событие через обработчик сообщений. Подробности см. в разд. "События" главы 32
Да
Да
SELECT ... INTO ...
Помещает выход обычного одиночного оператора SELECT в список предварительно объявленных переменных. Вызовет исключение, если оператор вернет множество строк
Да
Да
SUSPEND
Недоступен в триггерах! Оператор используется в процедурах, разработанных для вывода наборов множества строк в виде виртуальных таблиц - хранимые процедуры выбора. Он приостанавливает выполнение процедуры на время перемещения строки из кэша строк в клиентское приложение. Оператор не имеет этого эффекта в выполняемых хранимых процедурах, где он эквивалентен оператору EXIT
Да
Да
WHILE <условие> DO
Синтаксис условного цикла, при котором выполняется блок, пока условие не станет ложным. Подробности см. в разд. "Условные блоки" позже в этой главе
Да
Да
WHEN {ошибка [, ошибка . . . ] | ANY}
Синтаксис для обработки исключений. Аргументами могут быть одно или более определенных пользователем исключений или внутренне определенные исключения GDSCODE или SQLCODE. Подробности см. В главе 32
Да
Да
Программные конструкции
В следующих разделах рассматриваются программные конструкции, распознаваемые в PSQL.
Блоки BEGIN ... END
PSQL является структурированным языком. После объявления переменных процедурные операторы заключаются в операторные скобки BEGIN и END. В процессе разработки логики процедуры могут быть добавлены другие блоки; любой блок может включать другой блок, заключенный в BEGIN и END.
Символ терминатора не используется в ключевых словах BEGIN и END, за исключением финального ключевого слова END, который закрывает процедурный блок и завершает оператор CREATE PROCEDURE или CREATE TRIGGER. Это финальное ключевое слово END имеет специальный терминатор, который был определен в операторе SET TERM до начала данного определения.
Условные блоки
PSQL распознает два типа условных структур:
* ветвление, управляемое блоками IF ... THEN И, возможно, ELSE;
* циклическое выполнение блока, пока условие WHILE не станет ложным.
Начиная с версии 1.5 логические контекстные переменные INSERTING, UPDATING и DELETING и целочисленная контекстная переменная ROW_COUNT доступны в качестве предикатов в блоках, выполняющих операции изменения состояния данных. Подробности использования логических контекстных переменных в триггерах для множества событий см. в главе 31.
Конструкция IF... THEN... ELSEКонструкция IF ... THEN ... ELSE осуществляет ветвление в программе, проверяя указанное условие. Синтаксис:
IF (<условие>)
THEN <составной-оператор>
[ELSE <составной-оператор>]
<составной-оператор> = {<блок><оператор>;}
Предложение условие является предикатом, который должен быть истинным, чтобы выполнился оператор или блок, следующий за THEN. Необязательное предложение ELSE задает альтернативный оператор или блок, который будет выполняться, если условие окажется ложным. Условие может быть любым правильным предикатом.
! ! !
ПРИМЕЧАНИЕ. Предикат, проверяемый в IF, должен быть заключен в скобки.
. ! .
Когда вы кодируете условный переход в SQL, использование предложения ELSE иногда бывает необходимым для "нейтрализации" в случаях, когда проверяемый в IF предикат может не иметь ни истинного, ни ложного значения. Такое может произойти, когда в предикате во время выполнения сравниваются два пустых (NULL) значения. Логические значения истина и ложь являются в этом случае невозможными. Ветвь ELSE в этом случае является гарантией, что ваш блок выдаст результат.
Следующий фрагмент кода иллюстрирует использование IF ... ELSE в предположении, что FIRST_NAME, LAST_NAME, и LINE2 были ранее объявлены как переменные или аргументы:
. . .
IF (FIRST_NAME IS NOT NOLL) THEN
LINE2 = FIRST_NAME || ' ' || LAST_NAME;
ELSE
BEGIN
IF (LAST_NAME IS NOT NULL) THEN
LINE2 = LASTNAME;
ELSE
LINE2 = 'NO NAME SUPPLIED';
END
. . .
! ! !
СОВЕТ. Программисты языка Pascal, заметьте, что IF ... THEN завершен терминатором!
. ! .
По поводу CASEПока PSQL не поддерживает логику CASE В качестве конструкции программирования. Логика выражения CASE, конечно, доступна в DSQL. Подробности см. в главе 21.
Конструкция WHILE... DOWHILE ... DO является конструкцией цикла, который повторяет оператор или блок операторов, пока условие является истинным. Условие проверяется в начале каждого цикла, WHILE ... DO использует следующий синтаксис:
. . .
WHILE (<условие>) DO
BEGIN
<выполнение одного или более операторов>
<изменение значения операнда в условии> ;
END
/* Здесь продолжение выполнения */
. . .
В следующей простой процедуре WHILE проверяет значение переменной i, которая инициализируется как входной аргумент. Блок цикла уменьшает значение i при каждой итерации, и пока i остается больше нуля, значение выходного параметра r увеличивается на значение i. Когда процедура завершается, значение r возвращается вызвавшему приложению.
- C++ - Страустрап Бьярн - Программирование
- Энциклопедия разработчика модулей ядра Linux - Ори Померанц - Программирование
- Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп - Программирование