Управляющие операторы - это операторы SQL, позволяющие при написании программ на языке SQL использовать методы структурного программирования. Управляющие операторы SQL можно использовать в теле процедуры, триггера или динамического составного оператора.
В этой главе представлены синтаксис и описание поддерживаемых управляющих операторов SQL и оператора-процедуры-SQL.
Информация об операторе процедуры SQL изменена следующим образом:
В этой главе представлены синтаксические диаграммы, описания семантики, правила и примеры использования операторов, составляющих тело процедуры SQL, триггера или динамического составного оператора.
Внутреннее представление
>>-+---------+---+-| управляющий-оператор-SQL |-+-------------->< '-метка:--' '-| оператор-SQL |-------------' управляющий-оператор-SQL (1) |---+-оператор ALLOCATE CURSOR-------------+--------------------| | (1) | +-оператор присваивания----------------+ | (1) | +-оператор ASSOCIATE LOCATORS----------+ | (1) | +-оператор CASE------------------------+ | (2) | +-динамический составной оператор------+ +-оператор FOR-------------------------+ +-оператор GET DIAGNOSTICS-------------+ | (1) | +-оператор GOTO------------------------+ +-оператор IF--------------------------+ +-оператор ITERATE---------------------+ +-оператор LEAVE-----------------------+ | (1) | +-оператор LOOP------------------------+ | (1) | +-составной оператор процедуры---------+ | (1) | +-оператор REPEAT----------------------+ | (1) | +-оператор RESIGNAL--------------------+ +-оператор RETURN----------------------+ +-оператор SIGNAL----------------------+ '-оператор WHILE-----------------------'
Примечания:
Описание
В контексте триггера, функции SQL, метода SQL или динамического составного оператора метки можно задавать только для динамических составных операторов и операторов FOR и WHILE.
Прим.: | В тело процедуры SQL можно включить операторы CALL, но эти операторы CALL могут вызывать только другие процедуры SQL или процедуры C. Операторы CALL в теле процедуры SQL не могут вызывать другие типы хранимых процедур. |
Оператор FOR выполняет некоторый оператор или группу операторов для каждой строки таблицы.
Внутреннее представление
>>-+---------+---FOR--имя-цикла-for--AS-------------------------> '-метка:--' >-----+---------------------------------+--операторы SELECT-----> | (1) | '-имя-указателя--CURSOR FOR-------' .------------------------------. V | >----DO-------оператор-процедуры-SQL--;---+--END FOR------------> >-----+--------+----------------------------------------------->< '-метка--'
Примечания:
Описание
В триггере, функции, методе или динамическом составном операторе оператор-выборки должен состоять только из полной выборки с необязательным общим табличным выражением.
Правила
Примеры
В следующем примере оператор-for используется для обработки всей таблицы employee. Для каждой строки этой таблицы переменной SQL fullname присваивается строка, содержащая: фамилию работника, запятую, имя, пробел и инициал отчества. Каждое значение fullname вставляется в таблицу tnames.
BEGIN DECLARE fullname CHAR(40); FOR vl AS SELECT firstnme, midinit, lastname FROM employee DO SET fullname = lastname || ',' || firstnme ||' ' || midinit; INSERT INTO tnames VALUE (fullname); END FOR END
Составной оператор процедуры объединяет вместе другие операторы в процедуру SQL. Внутри составного оператора можно объявлять переменные SQL, указатели и обработчики условий.
Синтаксическая диаграмма теперь имеет заголовок: составной-оператор-процедуры.
.-NOT ATOMIC--. >>-+---------+--BEGIN----+-------------+------------------------> '-метка:--' '-ATOMIC------' >-----+------------------------------------------------+--------> | .------------------------------------------. | | V | | '-----+-| объявление-переменной-SQL |-+---;---+--' +-| объявление-условия |--------+ '-| объявление-кодов-возврата |-' >-----+-------------------------------------+-------------------> | .-------------------------------. | | V | | '----| объявление-оператора |--;---+--' >-----+------------------------------------+--------------------> | .------------------------------. | | V | | '----оператор-DECLARE-CURSOR--;---+--' >-----+---------------------------------------+-----------------> | .---------------------------------. | | V | | '----| объявление-обработчика |--;---+--' .------------------------------. V | >--------оператор-процедуры-SQL--;---+---END--+--------+------->< '-метка--' объявление-переменной-SQL .-,---------------------. V | |---DECLARE-------имя-переменной-SQL---+------------------------> .-DEFAULT NULL--------. >-----+-тип-данных----+---------------------+-+-----------------| | '-DEFAULT--константа--' | '-RESULT_SET_LOCATOR--VARYING-----------' объявление-условия |---DECLARE--имя-условия--CONDITION--FOR------------------------> .-VALUE-. .-SQLSTATE--+-------+---. >----+-----------------------+---строчная-константа-------------| объявление-оператора .-,----------------. V | |---DECLARE-----имя-оператора---+---STATEMENT-------------------| объявление-кодов-возврата |---DECLARE----+-SQLSTATE--CHAR (5)--+--------------------------> '-SQLCODE--INTEGER----' >-----+---------------------+-----------------------------------| '-DEFAULT--константа--' объявление-обработчика |---DECLARE----+-CONTINUE-+---HANDLER--FOR----------------------> +-EXIT-----+ '-UNDO-----' .-,-----------------------------------. V .-VALUE-. | >---------+-SQLSTATE--+-------+--строка--+--+-------------------> +-имя-условия------------------+ +-SQLEXCEPTION-----------------+ +-SQLWARNING-------------------+ '-NOT FOUND--------------------' >----оператор-процедуры-SQL-------------------------------------|
Оператор RETURN используется для возврата из подпрограммы. Для функций SQL и методов SQL он возвращает значение результата этой функции или метода. Для процедуры SQL он может возвращать необязательное целое значение состояния.
Внутреннее представление
>>-RETURN--+---------------------------------------------------------------+-> +-выражение-----------------------------------------------------+ +-NULL----------------------------------------------------------+ '-+-----------------------------------------+---полная-выборка--' | .-,----------------------------. | | V | | '-WITH-----общее-табличное-выражение---+--' >--------------------------------------------------------------><
Описание
Полную-выборку нельзя задавать для оператора RETURN процедуры.
Если подпрограмма - это скалярная функция или метод, полная выборка должна возвращать один столбец (SQLSTATE 42823) и не более одной строки (SQLSTATE 21000).
Если подпрограмма - это функция строки, она должна возвращать не более одной строки (SQLSTATE 21505).
Если подпрограмма - это табличная функция, она может возвращать ноль или большее число строк с одним или более столбцами.
Правила
Версия
Примеры
Используется оператор RETURN для возвращения из хранимой процедуры SQL - со значением 0 при успешном выполнении процедуры и со значением -200 в случае ошибки.
BEGIN ... GOTO FAIL ... SUCCESS: RETURN 0 FAIL: RETURN -200 END
Оператор SIGNAL SQLSTATE более не используется, вместо него используется этот оператор.
Оператор SIGNAL используется, чтобы сигнализировать об условии ошибки или предупреждения. Он вызывает возврат ошибки или предупреждения с заданным SQLSTATE и необязательным текстом сообщения.
Внутреннее представление
>>-SIGNAL-------------------------------------------------------> .-VALUE-. >-----+-SQLSTATE--+-------+--строчная-константа-sqlstate--+-----> '-имя-условия---------------------------------------' >-----+------------------------------------------------------------+> +-SET--MESSAGE_TEXT-- = --+-имя-переменной-----------------+-+ | '-строчная-константа-диагностики-' | | (1) | '-(--строка-диагностики--)-----------------------------------' >--------------------------------------------------------------><
Примечания:
Описание
В контексте динамического составного оператора, триггера, функции SQL или метода SQL также должны применяться следующие правила:
Если SQLSTATE не удовлетворяет этим правилам, возникает ошибка (SQLSTATE 428B3).
Версия
+438, если SQLSTATE начинается с '01' или '02'
-438 в остальных случаях
В операторе SIGNAL можно использовать любое допустимое значение SQLSTATE. Однако программистам рекомендуется определять новые значения SQLSTATE в диапазонах их значений, зарезервированных для прикладных программ. Это позволит избежать случайного использования значения SQLSTATE, которое может быть определено менеджером баз данных в будущих выпусках.
Примеры
Процедура SQL для более старой системы, которая сигнализирует об ошибке прикладной программы, если прикладной программе не известен номер заказчика. Таблица ORDERS (заказы) содержит внешний ключ для таблицы CUSTOMER (заказчик), требуя, чтобы CUSTNO (номер заказчика) существовал, прежде чем можно будет принять заказ.
CREATE PROCEDURE SUBMIT_ORDER (IN ONUM INTEGER, IN CNUM INTEGER, IN PNUM INTEGER, IN QNUM INTEGER) SPECIFIC SUBMIT_ORDER MODIFIES SQL DATA LANGUAGE SQL BEGIN DECLARE EXIT HANDLER FOR SQLSTATE VALUE '23503' SIGNAL SQLSTATE '75002' SET MESSAGE_TEXT = 'Неизвестный номер заказчика'; INSERT INTO ORDERS (ORDERNO, CUSTNO, PARTNO, QUANTITY) VALUES (ONUM, CNUM, PNUM, QNUM); END