MySQL вызов процедуры из триггера всегда возвращает ноль для параметров out - PullRequest
0 голосов
/ 13 апреля 2020

Параметр OUT моей хранимой процедуры всегда возвращает нулевое значение.

Вот пример таблицы, кода триггера и процедуры.

Таблица: test
Столбцы:

  • id - Int
  • status - enum(‘pass’, ‘fail’) (допускается ноль)

Значения в таблице:

id  |  status
1   |  null

Триггер:

create trigger BEFORE_UPDATE_TEST before update on `test` for each row begin

    call Test_BEFORE_UPDATE_TEST(old.id, @updatedStatus);

       ## I always get @updatedStatus null/nil

    if (@updatedStatus is not null and @updatedStatus <> new.status) then
        set new.status = @updatedStatus;
    end if;

end;

Процедура:

create procedure Test_BEFORE_UPDATE_TEST (
  IN id int(5),
  OUT status enum(‘pass’, ‘fail’)
)
begin
   @status = ‘pass’;

END;

Что не так с этим кодом, так как я получаю неожиданный результат как значение NULL в значении @updatedStatus, которое должно быть 'pass'.

Я посмотрел после QAs на stackoverflow, но не смог найти решение .

Я использую MySQLWorkbench в MacOS Catalina, и версия MySQL - 8.0.19.

1 Ответ

1 голос
/ 13 апреля 2020

Параметр OUT status в процедуре отличается от пользовательской переменной @status. Это всего два разных типа переменных.

Итак, процедура должна выглядеть следующим образом:

create procedure Test_BEFORE_UPDATE_TEST (
IN id int(5),
OUT status enum('pass', 'fail')
)
begin
 set status = 'pass';
END;

В триггере также следует использовать обычные переменные, объявленные с DECLARE:

create trigger BEFORE_UPDATE_TEST 
before update on test for each row 
begin

declare v_status enum('pass', 'fail');

call Test_BEFORE_UPDATE_TEST(old.id, v_status);

if (v_status is not null and v_status <> new.status) then
  set new.status = v_status;
end if;

end;
...