pracując nad tym, co napisał Code-Monk, rozważ następujące kwestie:
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
Przetestuj zapisaną procedurę
call uspK(); -- test it, no warnings on edge conditions
Czego nie robić
Jeden nie znaleźć dużo szczęścia z następującymi. Jeśli tak uważasz, uruchom go kilka razy;
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
ponieważ create temporary table if not exists temp
jest łuszcząca się
Komentarze ogólne
Nie powinno się zaczynać pisania przechowywanych proc, dopóki nie będzie biegle opanowany prosty temat DELIMITERS. Pisałem o nich w sekcji tutaj zwane ogranicznikami . Mam tylko nadzieję, że nie zmarnujesz niepotrzebnie czasu na tak prostą rzecz, która może zmarnować dużo czasu na debugowanie.
Pamiętaj też, że w Twoim pytaniu, jak również w tym dokumencie, tworzenie tabel to DDL że może mają duży procent ogólnego profilowania (wydajności). Spowalnia proc, w przeciwieństwie do używania istniejącej tabeli. Można by pomyśleć, że połączenie jest natychmiastowe, ale tak nie jest. W związku z tym, ze względu na wydajność, użycie istniejącej tabeli z wynikami umieszczonymi we własnym segmentowanym rowId jest znacznie szybsze niż trwałe obciążenie DDL.