MySQL: SET Переменная в, если существует условие

0

Я пытаюсь установить переменные, проверяя условие if exists. Я использовал : = для установки переменных, однако по какой-то причине кажется, что когда я пытаюсь установить переменную в условии if exists, она отображает результат для предыдущего запроса. Ниже приведен фрагмент кода из хранимой процедуры.

if exists (select @AccountVerified := AccountVerified, @IsActive := IsActive  from tblUserLookUp where UserName = inUserName) then
        begin
            select "1: From if condition", @AccountVerified, @IsActive;

            select @AccountVerified := AccountVerified, @IsActive := IsActive  from tblUserLookUp where UserName = inUserName;
            select "2: From select condition", @AccountVerified, @IsActive;
            select @AccountVerified, @IsActive;

            if @AccountVerified = 0 then
                set outErrorCode = 3;
            elseif  @IsActive = 0 then
                set outErrorCode = 4;
            end if;
        end;
    else
        set outErrorCode = 1;
    end if;

Я заметил это, пытаясь напечатать значения через инструкцию select после условия if и снова запустить запрос select в таблице.

2: Из условия выбора

похоже, показывает фактические текущие результаты. Однако,

1: Из условия if

похоже, отображает значение из предыдущего запроса.

Существует ли какая-либо концепция кэширования переменных или что вы не можете установить переменные в условии if? Я также открыт для любых других рекомендаций, которые у вас могут быть.

Единственная причина для этого - сохранить этот запрос выбора в той же таблице, что и запрос выбора select.

Теги:
stored-procedures
mysql-workbench
if-statement
variables

1 ответ

1
Лучший ответ

13.2.10.6 Подзапросы с EXISTS или NOT EXISTS

...

Традиционно подзапрос EXISTS начинается с SELECT *, но он может начинаться с SELECT 5 или SELECT column1 или вообще ничего. MySQL игнорирует список SELECT в таком подзапросе, поэтому он не имеет значения.

...

Опция:

...
SELECT
  @AccountVerified := AccountVerified,
  @IsActive := IsActive,
  @Exists := TRUE
FROM tblUserLookUp,
     (SELECT
       @AccountVerified := NULL,
       @IsActive := NULL,
       @Exists := FALSE) 'init'
WHERE UserName = inUserName;

IF (@Exists) THEN
  ...
ELSE
  ...
END IF;
...
  • 0
    Вау! Спасибо чувак. Похоже, хорошая альтернатива. Позвольте мне попробовать.
  • 0
    @wchiquito Я бы ожидал, что это будет вторая проблема ... он может сохранить старые значения переменных, если WHERE ничего не соответствует, так же, как SELECT ... INTO , а именно. dba.stackexchange.com/a/35207/11651 . Все они (или, по крайней мере, @Exists ) должны быть инициализированы в NULL или, возможно, в FALSE до выполнения этого запроса, поскольку пользовательские переменные имеют область действия сеанса ... потому что вы можете получить неожиданное, на первый взгляд, случайное действие на расстоянии, не делая этого, хотя он всегда работает правильно при первом подключении к новому соединению.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню