MySQL временная таблица в подзапросе

0

Я пытаюсь использовать временную таблицу в подзапросе (хранимую процедуру), но возвращает пустой набор результатов...

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
  • 0
    Вы уверены, что временные таблицы отбрасываются между выполнениями в одном соединении? CREATE...IF NOT IS EXISTS..SELECT не будет вставлен в таблицу, если она уже существует.
  • 0
    так что мне добавить таблицу удаления в конце процедуры?
Показать ещё 8 комментариев
Теги:
stored-procedures
temp-tables
subquery

1 ответ

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

При использовании CREATE... SELECT часть SELECT не будет заполнять таблицу, если она уже существует.

При создании временных таблиц в хранимой процедуре, которые не будут использоваться вне процедуры, лучше всего использовать инструкции DROP TEMPORARY TABLE IF EXISTS в начале и конце процедуры. Конечные - это то, что процедура очищается после себя; стартовые обеспечивают временные таблицы, оставшиеся от предыдущих исполнений (которые были ошибочно/не удалены до их удаления) не мешают текущим исполнениям. Вы также можете обернуть основной элемент процедуры в TRY и иметь капли вне TRY, чтобы гарантировать, что капли происходят, но это немного более продвинуто.

При использовании переменных session/user/@имейте в виду, что они являются глобальными для подключения к базе данных и могут переносить значения; когда это возможно, используйте локально переменные DECLAREd (объем которых не выходит за рамки процедуры). Бонус: также старайтесь убедиться, что имена таких переменных и параметры процедуры не являются двусмысленными с именами полей таблиц, используемых в процедуре; это может вызвать очень трудную диагностику проблем.

Ещё вопросы

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