Maison  >  Article  >  base de données  >  Comment pouvez-vous utiliser des procédures stockées récursives pour calculer des quantités calculées dans MySQL ?

Comment pouvez-vous utiliser des procédures stockées récursives pour calculer des quantités calculées dans MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 07:24:30707parcourir

How Can You Use Recursive Stored Procedures to Calculate Computed Quantities in MySQL?

Récursivité de procédure stockée pour calculer les quantités calculées

Créer une procédure stockée récursive dans MySQL pour déterminer la quantité calculée d'un élément donné nécessite de comprendre la structure de la table et la logique récursive.

Contexte du problème

Étant donné un tableau avec les colonnes « id », « parent_id » et « quantité », l'objectif est de calculer la quantité totale d'un article en traversant récursivement ses relations parent-enfant. Par exemple, l'élément 6 a une quantité calculée de 240 car ses parents sont 5 (quantité 4), 3 (quantité 2) et 2 (quantité 10).

Solution : procédure stockée récursive

<code class="mysql">DELIMITER $$

CREATE PROCEDURE calctotal(
   IN number INT,
   OUT total INT
)

BEGIN

   DECLARE parent_ID INT DEFAULT NULL ;
   DECLARE tmptotal INT DEFAULT 0;
   DECLARE tmptotal2 INT DEFAULT 0;

   SELECT parentid   FROM test   WHERE id = number INTO parent_ID;   
   SELECT quantity   FROM test   WHERE id = number INTO tmptotal;     

   IF parent_ID IS NULL
    THEN
    SET total = tmptotal;
   ELSE     
    CALL calctotal(parent_ID, tmptotal2);
    SET total = tmptotal2 * tmptotal;   
   END IF;

END$$

DELIMITER ;</code>

Invocation de procédure

Pour appeler la procédure stockée et obtenir la quantité calculée pour l'élément 6 :

<code class="mysql">SET @@GLOBAL.max_sp_recursion_depth = 255;
SET @@session.max_sp_recursion_depth = 255; 

CALL calctotal(6, @total);
SELECT @total;</code>

Répartition de la procédure

  • Paramètres d'entrée et de sortie : Le numéro IN spécifie l'élément de départ et le total OUT renvoie la quantité calculée.
  • Récursion Logique : L'ID parent et la quantité de l'article donné sont récupérés et stockés dans parent_ID et tmptotal. S'il n'y a pas de parent (c'est-à-dire que l'élément est à la racine), total est défini sur tmptotal. Sinon, un appel récursif est effectué à calctotal avec parent_ID comme entrée et le résultat est stocké dans tmptotal2. Le total calculé est ensuite calculé comme total = tmptotal2 * tmptotal.
  • Invocation de la procédure : Avant d'appeler la procédure, la profondeur de récursion maximale doit être ajustée pour éviter une erreur due à une récursivité excessive. L'appel réel prend 6 en entrée et le total calculé est stocké dans la variable @total, qui peut être récupérée à l'aide de SELECT @total.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn