Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zwei Probleme bei der Verwendung einer gespeicherten Prozedur in MySQL

Das ist die Einschränkung.

Jetzt die Problemumgehung:fügen Sie einen verschachtelten BEGIN ... END hinzu blockieren.

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 $$

Alle Variablen im äußeren Block sind im inneren Block immer noch gültig, es sei denn, eine andere Variable im inneren Block hat einen widersprüchlichen Namen.

Ein HANDLER im äußeren Block ist auch im Gültigkeitsbereich für Signale im inneren Block, es sei denn, dort wird ein widersprüchlicher Handler deklariert. In diesem Fall fängt der innere Handler die Ausnahme ab und das äußere Handle fängt alles ab, was vom inneren Handler ausgelöst wird, einschließlich eines RESIGNAL .

Mehrere Verschachtelungsebenen sind zulässig. Die Größe des thread_stack könnte ein Faktor sein, aber die Dokumentation ist unklar. Ich habe 262.144-Byte-Thread-Stacks ausgeführt, bevor es zum Standard gemacht wurde, und bin nie auf ein Limit gestoßen.