Формат блока описаний
Определение блока описаний процедурного блока.
Спецификация
::=
::=
::=
Синтаксические правила
-
Описание переменных простого типа аналогично описанию группы параметров:
VAR < список имен > < тип > [DEFAULT < список инициализаторов >];
-
Обращение к элементам массива выполняется с помощью квадратных скобок. Например, z[3].
-
Присвоение NULL-значения всему массиву (например, z:=NULL) полностью очищает массив (размерность массива становится равной 0).
-
Массивы безразмерные, при обращении к отсутствующим элементам возвращается NULL-значение.
-
Индексом массива являются неотрицательные значения типа SMALLINT.
-
Не поддерживается:
-
описание массивов в массиве (синтаксис array array);
-
описание массива внутри курсора (синтаксис array cursor);
-
описание массива курсоров (синтаксис array array cursor).
-
-
При описании массива байт (array byte (128)) невозможно обратиться к отдельному байту (получается массив массивов, трудности с отсутствием иерархии в синтаксисе), т.е. синтаксис z[3][5] недопустим.
Пример
declare var z array varchar(256);
-
< Виды исключений > процедурного языка и их десятичные коды приведены в таблице 4.
Таблица 4. Перечень < видов исключений > процедурного языка и их десятичных кодовВид исключения Код Описание DIVZERO -2 Деление на ноль UNDEFPROC -3 Попытка вызова неопределенной хранимой процедуры или отсутствие привилегии на вызов хранимой процедуры BADPARAM -4 Неверный параметр хранимой процедуры или стандартной функции. BADINDEX -5 Неправильный индекс массива или строки байт (BYTE, VARBYTE) BADRETVAL -6 Недопустимый тип возвращаемого хранимой процедурой значения NULLDATA -7 Попытка выполнить недопустимую операцию с NULL-значением (вычисление выражения при отсутствии данных) NOMEM -8 Не удается выделить память под переменные (обычно – превышен общий размер памяти, размер отдельной переменной и т.п.) BADCURSOR -9 Несоответствие структуры курсора количеству и/или типам записей запроса (при открытии или возврате курсора) CURNOTOPEN -10 Попытка выполнить FETCH или CLOSE для курсора, который не был открыт BADCODE -11 Неверный байт-код скомпилированной хранимой процедуры (устраняется перекомпиляцией процедуры) TRIGQUERY -12 Вызов SQL-запроса в хранимой процедуре, в которой запрещено использование SQL-запросов APPENDNOTSTARTED -14 Перед подачей putm не было вызвано оператора start append, или он завершился неудачно QUERYWHENAPPEND -15 Между start append и end append нельзя использовать execute APPENDACTIVE -16 Попытка выполнить start append, когда предыдущий start append не был завершен при помощи end append APPLICATIONERROR -17 Сообщение сгенерировано функцией raise_error() INVTRSTATE -18 Ошибка с состоянием транзакций (чаще всего – количество открытий не совпадает с количеством закрытий транзакции) OVERFLOW -19 Переполнение типа переменной CUSTOM < число > -100 Код завершения пользовательского исключения СУБД ЛИНТЕР -
< Код завершения >
– коды завершения СУБД ЛИНТЕР (см. документ «СУБД ЛИНТЕР. Справочник кодов завершения», подраздел «Коды завершения компилятора процедурного языка (10000-10086)»). -
Максимальная длина строковой переменной процедурного языка 3919 символов. Но если в операторе
execute direct "insert into table_results values('"+str+"');";
строковой переменной str присвоить значение длиной 3900 символов (меньше, чем максимальная длина), то всё равно возникнет исключение NOMEM, потому что значение, которое стоит после execute direct – это тоже строковое значение, и получаемая в результате суммарная длина строки "insert into table_results values" и переменной str превышает допустимое значение.
-
Имена пользовательских исключений локальны в каждой процедуре (они возвращаются с помощью функции
raise_error()
). При определении таких исключений им автоматически присваиваются внутренние коды. Чтобы передать такое исключение на вызывающий уровень (RESIGNAL) и корректно обработать его там, необходимо, чтобы коды этого исключения, как на вызывающем, так и на уровне процедуры совпадали. Для этого можно явно задать код для пользовательского исключения (целое число):CUSTOM < код >
-
Пользовательские исключения никогда не совпадают с кодами завершения СУБД ЛИНТЕР (они хранятся со знаком минус).
-
Необработанное исключение в триггере эквивалентно FALSE (запрету). После возникновения исключения в одном из триггеров (если они могут запретить операцию) выполнение других триггеров продолжается. Т.е. все триггеры будут выполнены (однако, если один из BEFORE-триггеров запретил операцию, то операция не выполнится, и соответствующие AFTER-триггеры тоже не выполнятся).
Пример блока описаний
declare var a,b typeof(result); var i int default 0; exception badcur for badcursor; exception notab for 2202;