Замечания по выпуску


38.6 Глава 7 "SQL Procedures" теперь называется "SQL Control Statements"

Управляющие операторы - это операторы SQL, позволяющие при написании программ на языке SQL использовать методы структурного программирования. Управляющие операторы SQL можно использовать в теле процедуры, триггера или динамического составного оператора.

В этой главе представлены синтаксис и описание поддерживаемых управляющих операторов SQL и оператора-процедуры-SQL.

38.6.1 Оператор процедуры 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-----------------------'
 

Примечания:

  1. Этот оператор поддерживается только внутри процедуры SQL.

  2. Этот оператор поддерживается только внутри триггера, функции SQL или метода SQL. Он должен быть самым внешним оператором.

Описание

метка:
Задает метку для оператора процедуры SQL. Эта метка должна быть уникальной в списке операторов процедуры SQL, включая все вложенные составные операторы в этом списке. Обратите внимание, что в составных операторах, не являющихся вложенными, может использоваться та же метка. Список операторов процедуры SQL может содержать некоторое число управляющих операторов SQL.

В контексте триггера, функции SQL, метода SQL или динамического составного оператора метки можно задавать только для динамических составных операторов и операторов FOR и WHILE.

оператор-SQL
Тело процедуры SQL может содержать все выполняемые операторы SQL, за исключением следующих:

Прим.:В тело процедуры SQL можно включить операторы CALL, но эти операторы CALL могут вызывать только другие процедуры SQL или процедуры C. Операторы CALL в теле процедуры SQL не могут вызывать другие типы хранимых процедур.

38.6.2 FOR

FOR

Оператор FOR выполняет некоторый оператор или группу операторов для каждой строки таблицы.

Внутреннее представление

>>-+---------+---FOR--имя-цикла-for--AS------------------------->
   '-метка:--'
 
>-----+---------------------------------+--операторы SELECT----->
      |                           (1)   |
      '-имя-указателя--CURSOR FOR-------'
 
           .------------------------------.
           V                              |
>----DO-------оператор-процедуры-SQL--;---+--END FOR------------>
 
>-----+--------+-----------------------------------------------><
      '-метка--'
 

Примечания:

  1. Эта опция может использоваться только в контексте процедуры SQL.

Описание

метка
Задает метку для этого оператора FOR. Если задана метка начала, ее можно использовать в операторах LEAVE и ITERATE. Если задана метка конца, она должна совпадать с меткой начала.

имя-цикла-for
Задает метку для неявного составного оператора, создаваемого для реализации этого оператора FOR. Она подчиняется тем же правилам, что метка составного оператора, но ее нельзя использовать в операторе ITERATE или LEAVE внутри этого оператора FOR. Имя-цикла-for используется в качестве спецификатора для имен столбцов, возвращаемых заданным оператором-выборки.

имя-указателя
Задает имя указателя, используемого для выборки строк из таблицы результатов оператора SELECT. Если это имя не задано, DB2 генерирует уникальное имя указателя.

оператор-выборки
Задает оператор SELECT для этого указателя. Все столбцы в списке выборки должны иметь имена и имена столбцов не должны совпадать.

В триггере, функции, методе или динамическом составном операторе оператор-выборки должен состоять только из полной выборки с необязательным общим табличным выражением.

оператор-процедуры-SQL
Задает оператор (или операторы), который должен быть выполнен для каждой строки таблицы.

Правила

Примеры

В следующем примере оператор-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

38.6.3 Заголовок раздела Compound Statement изменен на Compound Statement (Procedure)

Составной оператор процедуры объединяет вместе другие операторы в процедуру 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-------------------------------------|
 

объявление-оператора
В объявлении-оператора объявляется список из одного или нескольких имен, локальных для этого составного оператора. Имя оператора не может совпадать с другим именем оператора в том же составном операторе.

38.6.4 RETURN

RETURN

Оператор RETURN используется для возврата из подпрограммы. Для функций SQL и методов SQL он возвращает значение результата этой функции или метода. Для процедуры SQL он может возвращать необязательное целое значение состояния.

Внутреннее представление

>>-RETURN--+---------------------------------------------------------------+->
           +-выражение-----------------------------------------------------+
           +-NULL----------------------------------------------------------+
           '-+-----------------------------------------+---полная-выборка--'
             |       .-,----------------------------.  |
             |       V                              |  |
             '-WITH-----общее-табличное-выражение---+--'
 
>--------------------------------------------------------------><
 

Описание

выражение
Задает значение, возвращаемое из подпрограммы:

NULL
Задает, что функция или метод возвращает пустое значение типа данных, определенного в условии RETURNS. Ключевое слово NULL нельзя задавать для оператора RETURN процедуры.

WITH общее-табличное-выражение
Определяет общее табличное выражение, используемое с задаваемой после него полной выборкой.

полная-выборка
Задает строку или строки, возвращаемые для этой функции. Число столбцов в полной выборке должно совпадать с числом столбцов в результате функции (SQLSTATE 42811). Кроме того, статические типы столбцов полной выборки должны быть приводимы к объявленным типам столбцов результата функции с помощью правил присваивания столбцов (SQLSTATE 42866).

Полную-выборку нельзя задавать для оператора RETURN процедуры.

Если подпрограмма - это скалярная функция или метод, полная выборка должна возвращать один столбец (SQLSTATE 42823) и не более одной строки (SQLSTATE 21000).

Если подпрограмма - это функция строки, она должна возвращать не более одной строки (SQLSTATE 21505).

Если подпрограмма - это табличная функция, она может возвращать ноль или большее число строк с одним или более столбцами.

Правила

Версия

Примеры

Используется оператор RETURN для возвращения из хранимой процедуры SQL - со значением 0 при успешном выполнении процедуры и со значением -200 в случае ошибки.

   BEGIN
   ...
      GOTO FAIL
   ...
      SUCCESS: RETURN 0
      FAIL: RETURN -200
   END

38.6.5 SIGNAL

Оператор SIGNAL SQLSTATE более не используется, вместо него используется этот оператор.

SIGNAL

Оператор SIGNAL используется, чтобы сигнализировать об условии ошибки или предупреждения. Он вызывает возврат ошибки или предупреждения с заданным SQLSTATE и необязательным текстом сообщения.

Внутреннее представление

>>-SIGNAL------------------------------------------------------->
 
                  .-VALUE-.
>-----+-SQLSTATE--+-------+--строчная-константа-sqlstate--+----->
      '-имя-условия---------------------------------------'
 
>-----+------------------------------------------------------------+>
      +-SET--MESSAGE_TEXT-- = --+-имя-переменной-----------------+-+
      |                         '-строчная-константа-диагностики-' |
      |                          (1)                               |
      '-(--строка-диагностики--)-----------------------------------'
 
>--------------------------------------------------------------><
 

Примечания:

  1. Эта опция сделана доступной только в области видимости оператора CREATE TRIGGER для совместимости с более ранними версиями DB2.

Описание

SQLSTATE VALUE строчная-константа-sqlstate
Задает строчную константу, представляющую SQLSTATE. Она должна быть символьной строчной константой, содержащей ровно 5 символов и удовлетворяющей правилам для SQLSTATE:

В контексте динамического составного оператора, триггера, функции SQL или метода SQL также должны применяться следующие правила:

Если SQLSTATE не удовлетворяет этим правилам, возникает ошибка (SQLSTATE 428B3).

имя-условия
Задает имя условия. Имя условия должно быть уникальным в процедуре; на него можно ссылаться только внутри составного оператора, в котором оно определено.

SET MESSAGE_TEXT=
Задает строку, описывающую ошибку или предупреждение. Эта строка возвращается в поле SQLERRMC области SQLCA. Если заданная строка длиннее 70 байт, она усекается (предупреждение не выдается). Это условие можно задавать, только если заданы SQLSTATE или имя-условия (SQLSTATE 42601).

имя-переменной
Указывает переменную SQL, которая должна быть объявлена внутри этого составного оператора. Эта переменная SQL должна быть определена с типом данных CHAR или VARCHAR.

строчная-константа-диагностики
Задает символьную строку-константу, содержащую текст сообщения.

строка-диагностики
Выражение типа CHAR или VARCHAR, возвращающее символьную строку длиной до 70 байт, описывающую условие ошибки. Если эта строка длиннее 70 байт, она будет усечена. Эта опция сделана доступной только в области видимости оператора CREATE TRIGGER для совместимости с более ранними версиями DB2. Не рекомендуется использовать ее в обычных случаях.

Версия

Примеры

Процедура 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


[ Начало страницы | Страница назад | Страница вперед | Содержание | Индекс ]