Questa è la restrizione.
Ora, la soluzione alternativa:aggiungi un BEGIN ... END
annidato blocco.
DELIMITER $$
CREATE PROCEDURE ...
BEGIN
DECLARE ... INT ... -- variable
CREATE TEMPORARY TABLE... -- following the declarations, no more declarations allowed, unless...
BEGIN -- resets the scope, changes the rules, allows more declarations
DECLARE ... INT ... -- variables
DECLARE ... CURSOR ...
DECLARE CONTINUE HANDLER ...
OPEN ...
...
END;
END $$
Tutte le variabili nel blocco esterno sono ancora nell'ambito del blocco interno, a meno che un'altra variabile nel blocco interno non abbia un nome in conflitto.
Un HANDLER
nel blocco esterno rientra anche nell'ambito dei segnali nel blocco interno, a meno che non vi sia dichiarato un gestore in conflitto, nel qual caso il gestore interno catturerà l'eccezione e l'handle esterno catturerà qualsiasi cosa lanciata dal gestore interno, incluso un RESIGNAL
.
Sono consentiti più livelli di annidamento. La dimensione del thread_stack
potrebbe essere un fattore, ma la documentazione non è chiara. Ho eseguito stack di thread da 262.144 byte da prima che fosse impostato come predefinito e non ho mai incontrato un limite.