powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Условие в хранимой процедуре
3 сообщений из 3, страница 1 из 1
Условие в хранимой процедуре
    #39995973
dt88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравия желаю!

Не могу понять причину ошибки, логика процедуры такая: проверка - существует ли запись с таким product_id, если есть - возвращаем соответствующее информационное сообщение, если нет - добавляем запись.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN
IF(SELECT EXISTS(SELECT * FROM `product_list` WHERE `product_id`= product_id)) THEN
	SET result=CONCAT('{"result": 0,"description": "Запись id', product_id,' уже существует","id": 0};');
ELSE
	INSERT INTO `product_list` (`id`, `source_type`, `source_id`, `product_id`, `product_url`, `product_name`, `date_add`) VALUES (NULL, source_type, source_id, product_id, product_url, product_name, CURRENT_TIMESTAMP);
    SET result = CONCAT('{"result": 1,"description": "Добавлено","id": ', (SELECT LAST_INSERT_ID()), '};');
END IF;
END



Но беда в том. что если таблица полностью пустая - добавление записи происходит, а далее, даже для нового product_id происходит возврат. что запись уже существует.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
#таблица пустая, вызываю хранимку
CALL `product_add`(1, 2, 3, 4, 5, @result); SELECT @result AS `result`;
#результат - добавлено. Вызываю ещё раз с тким же айдишником:
CALL `product_add`(1, 2, 3, 4, 5, @result); SELECT @result AS `result`;
#результат  - запись уже существует. Корректное поведение. но когда меняю входной параметр:
CALL `product_add`(1, 2, 33333, 4, 5, @result); SELECT @result AS `result`;
#результат {"result": 0,"description": "Запись id33333 уже существует","id": 0}; - почему? 


При этом обычный запрос SELECT EXISTS(SELECT * FROM `product_list` WHERE `product_id`= [АЙДИПРОДУКТА]) отрабатывает корректно, т.е. возвращает 0 и 1 для разных случаев.

Спасибо!
...
Рейтинг: 0 / 0
Условие в хранимой процедуре
    #39996022
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрим на подзапрос
Код: sql
1.
SELECT * FROM `product_list` WHERE `product_id`= product_id


Если существует локальная переменная product_id (параметр функции или определена в DECLARE), то во WHERE используется она, и результат будет либо TRUE, если переменная не NULL, либо NULL , если переменная NULL.

Если такой переменной не существует, то во WHERE используется поле с таким именем из таблицы product_list , и результат будет либо TRUE, если в таблице есть записи, и последняя обработанная запросом запись имеет в этом поле не NULL, либо NULL , если таблица пуста либо последняя обработанная запросом запись имеет в этом поле NULL.

Если это была попытка сравнить поле и значение переменной, то подзапрос должен быть
Код: sql
1.
SELECT * FROM product_list WHERE product_list.product_id = product_id


В этом случае до знака равенства - поле таблицы, а после - переменная.

Или другими словами - переменная всегда имеет приоритет перед одноимённым полем и маскирует его.
...
Рейтинг: 0 / 0
Условие в хранимой процедуре
    #39996039
dt88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, огромная благодарность Вам за развёрнутый ответ. Ошибку и причину понял.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Условие в хранимой процедуре
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]