Я пытаюсь использовать временную таблицу в подзапросе (хранимую процедуру), но возвращает пустой набор результатов...
CREATE DEFINER='root'@'localhost' PROCEDURE 'get_profile_with_templates'(IN _username NVARCHAR(50), IN _template NVARCHAR(50))
BEGIN
SELECT id INTO @template FROM profile_template WHERE name=_template LIMIT 1;
SELECT * FROM profile WHERE username=_username AND template=@template LIMIT 1;
CREATE TEMPORARY TABLE IF NOT EXISTS sections SELECT * FROM profile_template_section WHERE template=@template;
**CREATE TEMPORARY TABLE IF NOT EXISTS components SELECT * FROM component_template WHERE section IN (SELECT id FROM sections);**
SELECT * FROM sections;
SELECT * FROM components;
SELECT * FROM component_template_option WHERE component_template IN (SELECT id FROM components);
END
запрос между ** - тот, который возвращает пустое... если я запускаю тот же запрос в реальной таблице, он возвращает значения...
CREATE DEFINER='root'@'localhost' PROCEDURE 'get_profile_with_templates'(IN _username NVARCHAR(50), IN _template NVARCHAR(50))
BEGIN
DROP TEMPORARY TABLE IF EXISTS sections;
DROP TEMPORARY TABLE IF EXISTS components;
SELECT id INTO @template FROM profile_template WHERE name=_template LIMIT 1;
SELECT * FROM profile WHERE username=_username AND template=@template LIMIT 1;
CREATE TEMPORARY TABLE IF NOT EXISTS sections SELECT * FROM profile_template_section WHERE template=@template;
CREATE TEMPORARY TABLE IF NOT EXISTS components SELECT * FROM component_template WHERE section IN (SELECT id FROM sections);
SELECT * FROM sections;
SELECT * FROM components;
SELECT * FROM component_template_option WHERE component_template IN (SELECT id FROM components);
DROP TEMPORARY TABLE IF EXISTS sections;
DROP TEMPORARY TABLE IF EXISTS components;
END
При использовании CREATE... SELECT
часть SELECT не будет заполнять таблицу, если она уже существует.
При создании временных таблиц в хранимой процедуре, которые не будут использоваться вне процедуры, лучше всего использовать инструкции DROP TEMPORARY TABLE IF EXISTS
в начале и конце процедуры. Конечные - это то, что процедура очищается после себя; стартовые обеспечивают временные таблицы, оставшиеся от предыдущих исполнений (которые были ошибочно/не удалены до их удаления) не мешают текущим исполнениям. Вы также можете обернуть основной элемент процедуры в TRY и иметь капли вне TRY, чтобы гарантировать, что капли происходят, но это немного более продвинуто.
При использовании переменных session/user/@имейте в виду, что они являются глобальными для подключения к базе данных и могут переносить значения; когда это возможно, используйте локально переменные DECLAREd (объем которых не выходит за рамки процедуры). Бонус: также старайтесь убедиться, что имена таких переменных и параметры процедуры не являются двусмысленными с именами полей таблиц, используемых в процедуре; это может вызвать очень трудную диагностику проблем.
CREATE...IF NOT IS EXISTS..SELECT
не будет вставлен в таблицу, если она уже существует.