Я пытаюсь установить переменные, проверяя условие 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.
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;
...
WHERE
ничего не соответствует, так же, какSELECT ... INTO
, а именно. dba.stackexchange.com/a/35207/11651 . Все они (или, по крайней мере,@Exists
) должны быть инициализированы вNULL
или, возможно, вFALSE
до выполнения этого запроса, поскольку пользовательские переменные имеют область действия сеанса ... потому что вы можете получить неожиданное, на первый взгляд, случайное действие на расстоянии, не делая этого, хотя он всегда работает правильно при первом подключении к новому соединению.