работейки върху написаното от Code-Monk, помислете за следното:
drop procedure if exists uspK;
DELIMITER $$
create procedure uspK ()
BEGIN
drop temporary table if exists temp; -- could be some other random structure residue
create temporary table temp
SELECT aID, bID
FROM tags
WHERE placeID = "abc" AND tagID = "def";
-- use the temp table somehow
-- ...
-- ...
-- ...
drop temporary table temp; -- otherwise it survives the stored proc call
END
$$ -- signify end of block
DELIMITER ; -- reset to default delimiter
Тествайте съхранена процедура
call uspK(); -- test it, no warnings on edge conditions
Какво да не правите
Човек бине намерете много късмет със следното. Ако мислите така, стартирайте го няколко пъти;
drop procedure if exists uspK;
DELIMITER $$
create procedure uspK ()
BEGIN
-- drop temporary table if exists temp;
create temporary table if not exists temp
SELECT aID, bID
FROM tags
WHERE placeID = "abc" AND tagID = "def";
-- use the temp table somehow
-- ...
-- ...
-- ...
-- drop temporary table temp; -- otherwise it survives the stored proc call
END
$$ -- signify end of block
DELIMITER ; -- reset to default delimiter
тъй като create temporary table if not exists temp
е люспест
Общи коментари
Човек не трябва да се впуска в писането на съхранени процедури, докато не владее донякъде простата тема за DELIMITERS. Пише за тях в раздел тук наречени Разделители . Просто се надявам да ви предпазя от ненужно губене на време за толкова просто нещо, което може да загуби много време за отстраняване на грешки.
Освен това тук във вашия въпрос, както и в тази препратка, имайте предвид, че създаването на таблици е DDL че може имат голям процент от общото профилиране (производителност). Забавя процедура в сравнение с използването на вече съществуваща таблица. Някой може да си помисли, че обаждането е мигновено, но не е така. По този начин, за производителност, използването на вече съществуваща таблица с резултати, поставени в техния собствен сегментиран rowId, е много по-бързо от трайното натоварване на DDL.