2009-07-22 15 views
5

Podczas korzystania z przygotowanych oświadczeń w procedurach przechowywanych, czy należy je zwolnić na końcu procedury, czy też nie, i dlaczego?Czy przygotowane instrukcje powinny zostać zwolnione, jeśli są używane w procedurach przechowywanych?

Niektóre kod wyjaśnić:

CREATE PROCEDURE getCompanyByName (IN name VARCHAR(100)) 
NOT DETERMINISTIC 
BEGIN 
    PREPARE gcbnStatement FROM 'SELECT * FROM Companies WHERE name=? LIMIT 1'; 
    SET @companyName = name; 
    EXECUTE gcbnStatement USING @companyName; 
    DEALLOCATE PREPARE gcbnStatement; 
END $$ 

Więc - jeżeli oświadczenie deallocate być tam czy nie? Twoje zdrowie!

/Victor

Odpowiedz

5

Według MySQL docs:

przygotowane oświadczenie jest specyficzna dla sesja, w której został utworzony. Jeśli zakończysz sesję bez deallocating uprzednio przygotowanej instrukcji , serwer zwolni ją automatycznie: .

Tak, nie, nie zawracałbym sobie głowy robieniem tego wyraźnie, chyba że masz bardzo długie sesje.

+0

Dzięki ... Choć nie jest to zbytnio "dlaczego", to z pewnością jest to najlepsza odpowiedź;) – Victor

+0

Dokumenty MySQL mówią również: "Przygotowane oświadczenie jest również globalne dla sesji .Jeśli utworzysz przygotowane oświadczenie w ciągu zapisana procedura _it nie jest zwalniana, gdy zapisana procedura kończy się. ". Dlatego wyraźnie zwolniłem po zakończeniu egzekucji. – Yasir

1

Jeśli używasz łączenia połączeń, zdecydowanie warto zwolnić je.

+0

Ok, dzięki. Informacyjny. – Victor