Определение блока описаний процедурного блока.
::=
::=
::=
Описание переменных простого типа аналогично описанию группы параметров:
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.
Вид исключения | Код | Описание |
---|---|---|
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 | Ошибка с состоянием транзакций (чаще всего – количество открытий не совпадает с количеством закрытий транзакции) |
BADDATA | -19 | Неверный формат данных (при считывании из BLOB-значения и прочих внешних структурированных данных) |
RANGEERROR | -20 | Выход за предел допустимых значений переменной |
CUSTOM <число> | -100 | Код завершения пользовательского исключения СУБД ЛИНТЕР |
<Код завершения>
– коды завершения СУБД ЛИНТЕР (см. документ «СУБД ЛИНТЕР. Справочник кодов завершения»).
Максимальная длина строковой переменной процедурного языка 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;