Формат блока описаний

         

Определение блока описаний процедурного блока.

Спецификация

Синтаксические правила

  1. Описание переменных простого типа аналогично описанию группы параметров:

    VAR < список имен > < тип > [DEFAULT < список инициализаторов >];
  2. Обращение к элементам массива выполняется с помощью квадратных скобок. Например, z[3].

  3. Присвоение NULL-значения всему массиву (например, z:=NULL) полностью очищает массив (размерность массива становится равной 0).

  4. Массивы безразмерные, при обращении к отсутствующим элементам возвращается NULL-значение.

  5. Индексом массива являются неотрицательные значения типа SMALLINT.

  6. Не поддерживается:

    • описание массивов в массиве (синтаксис array array);

    • описание массива внутри курсора (синтаксис array cursor);

    • описание массива курсоров (синтаксис array array cursor).

  7. При описании массива байт (array byte (128)) невозможно обратиться к отдельному байту (получается массив массивов, трудности с отсутствием иерархии в синтаксисе), т.е. синтаксис z[3][5] недопустим.

    Пример

    declare var z array varchar(256);
  8. < Виды исключений > процедурного языка и их десятичные коды приведены в таблице 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Код завершения пользовательского исключения СУБД ЛИНТЕР

  9. < Код завершения > – коды завершения СУБД ЛИНТЕР (см. документ «СУБД ЛИНТЕР. Справочник кодов завершения», подраздел «Коды завершения компилятора процедурного языка (10000-10086)»).

  10. Максимальная длина строковой переменной процедурного языка 3919 символов. Но если в операторе

    execute direct "insert into table_results values('"+str+"');";

    строковой переменной str присвоить значение длиной 3900 символов (меньше, чем максимальная длина), то всё равно возникнет исключение NOMEM, потому что значение, которое стоит после execute direct – это тоже строковое значение, и получаемая в результате суммарная длина строки "insert into table_results values" и переменной str превышает допустимое значение.

  11. Имена пользовательских исключений локальны в каждой процедуре (они возвращаются с помощью функции raise_error()). При определении таких исключений им автоматически присваиваются внутренние коды. Чтобы передать такое исключение на вызывающий уровень (RESIGNAL) и корректно обработать его там, необходимо, чтобы коды этого исключения, как на вызывающем, так и на уровне процедуры совпадали. Для этого можно явно задать код для пользовательского исключения (целое число):

    CUSTOM < код >
  12. Пользовательские исключения никогда не совпадают с кодами завершения СУБД ЛИНТЕР (они хранятся со знаком минус).

  13. Необработанное исключение в триггере эквивалентно FALSE (запрету). После возникновения исключения в одном из триггеров (если они могут запретить операцию) выполнение других триггеров продолжается. Т.е. все триггеры будут выполнены (однако, если один из BEFORE-триггеров запретил операцию, то операция не выполнится, и соответствующие AFTER-триггеры тоже не выполнятся).

Пример блока описаний

declare
  var a,b typeof(result);
  var i int default 0;
  exception badcur for badcursor;
  exception notab for 2202;