Mysql
 sql >> Base de données >  >> RDS >> Mysql

START TRANSACTION dans le contexte BEGIN ... END ou en dehors de la syntaxe LOOP

  1. Non :les instructions composées ne peuvent être utilisées que dans le corps des programmes stockés.

  2. START TRANSACTION; et COMMIT; sont des déclarations distinctes. Si vous voulez que le corps d'un programme stocké contienne plusieurs instructions, il devra enfermer ces instructions dans une sorte de bloc d'instruction composé tel que BEGIN ... END (ce qui revient à placer un bloc d'instructions entre accolades { ... } dans un langage de type C).

    Cela dit, vous pourriez avoir un programme stocké qui ne contient que l'instruction unique START TRANSACTION; ou COMMIT; - un tel programme ne nécessiterait aucun bloc d'instructions composées et commencerait simplement un nouveau / validerait la transaction en cours respectivement.

    En dehors d'un programme stocké, où les blocs d'instructions composés ne sont pas autorisés, vous pouvez émettre START TRANSACTION; et COMMIT; déclarations au fur et à mesure des besoins.

  3. LOOP est également un bloc d'instruction composé, qui n'est valide que dans une procédure stockée. Ce n'est pas nécessaire pour enfermer une LOOP bloc dans un BEGIN ... END bloc, bien que ce soit habituel (sinon, il est difficile d'effectuer toute initialisation de boucle requise).

Dans votre cas, où vous souhaitez apparemment insérer des données dans une table à partir d'une construction en boucle, vous devrez soit :

  • définir un programme stocké dans lequel vous utilisez LOOP;

  • itérer une boucle dans un programme externe qui exécute des requêtes de base de données à chaque itération ; ou

  • redéfinissez votre logique en termes d'ensembles sur lesquels SQL peut opérer directement.