Wednesday, June 24, 2009

MySQL: хранимые процедуры

Некоторые "особенности" работы с функциями/процедурами/триггерами в MySQL.

  1. Внутри блока BEGIN-END должен соблюдаться следующий порядок :
    BEGIN
    DECLARE variables;
    DECLARE cursors;
    DECLARE conditions;
    DECLARE handlers;
    ...
    END;

  2. Если какая-то команда (например PREPARE) не допускается в функции (триггере), то вызвать из неё процедуру, содержащую такую команду также не получится.


  3. PREPARE/EXECUTE не работает с локальными переменными - только глобальные переменные (типа @a, @b).

    Это работать не будет:
    DECLARE sql VARCHAR(32) DEFAULT 'SELECT 1';
    PREPARE stmt FROM sql;

    То же самое относится и к EXECUTE .. USING ..


  4. FETCH [cursor_name] INTO .. не работает с глобальными переменными.  (!?)

    Это работать не будет:
    FETCH mycursor INTO @a;

  5. PREPARE не может использоваться для объявления курсора.


  6. COMMIT не может использоваться в функциях и триггерах (соответственно, см п.2).


  7. Тело процедуры нельзя изменить с помощью ALTER PROCEDURE. Для этого надо последовательно выполнить DROP PROCEDURE и CREATE PROCEDURE.

No comments:

Post a Comment