trabalhando no que Code-Monk escreveu, considere o seguinte:
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
Procedimento armazenado de teste
call uspK(); -- test it, no warnings on edge conditions
O que não fazer
Um não encontrar muita sorte com o seguinte. Se você acha que sim, execute-o algumas vezes;
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
porque
create temporary table if not exists temp
é esquisito Comentários gerais
Não se deve embarcar em escrever procs armazenados até ser um pouco fluente no tópico simples de DELIMITERS. Escreveu sobre eles em uma seção aqui chamados Delimitadores . Apenas esperando afastá-lo do desperdício desnecessário de tempo em uma coisa tão simples, que pode desperdiçar muito tempo de depuração.
Além disso, aqui na sua pergunta, bem como nessa referência, tenha em mente que a criação de tabelas é DDL que pode têm uma grande porcentagem do perfil geral (desempenho). Ele desacelera um proc versus usar uma tabela pré-existente. Pode-se pensar que a chamada é instantânea, mas não é. Como tal, para desempenho, usar uma tabela pré-existente com os resultados colocados em seu próprio rowId segmentado é muito mais rápido do que suportar a sobrecarga de DDL.