Maison  >  Article  >  base de données  >  Application des variables Mysql, des curseurs et des procédures stockées

Application des variables Mysql, des curseurs et des procédures stockées

齐天大圣
齐天大圣original
2020-05-28 11:36:591700parcourir

Mysql prend en charge les procédures stockées depuis la version 5.0. En termes simples, une procédure stockée est un SQL encapsulé, mais ce n'est pas seulement du SQL, elle contient généralement aussi des variables, des jugements conditionnels, des corps de boucle, des curseurs, etc.

Le rôle des procédures stockées

Dans de nombreux scénarios, les données de plusieurs tables doivent être traitées pour générer les nouvelles données dont nous avons besoin. Les données de ces multiples tables ne peuvent pas être fournies via des méthodes de requête telles que les connexions, et ne peuvent être générées que par jugement et bouclage. À ce stade, vous pouvez utiliser des procédures stockées pour y parvenir.

De plus, les procédures stockées présentent également certains avantages, tels que des performances supérieures et des requêtes réseau réduites. Si vous n'utilisez pas de procédures stockées pour l'implémenter, vous devez appeler MySQL plusieurs fois et générer plusieurs requêtes si vous utilisez PHP pour l'implémenter.

Bien sûr, les procédures stockées ne sont pas sans défauts. Elles sont relativement déboguées et ne prennent pas en charge le clustering.

Créer une procédure stockée

La syntaxe de création d'une procédure stockée est la suivante :

CREATE PROCEDURE 过程名(参数) 
BEGIN
 过程体
END

Concernant les paramètres, le la syntaxe de définition des paramètres est

[IN|OUT|INOUT] Le type de nom de paramètre

  • IN signifie que la variable ne peut être utilisée que dans le corps de la procédure

  • OUT signifie que les variables ne peuvent être utilisées qu'en dehors du processus

  • INOUT signifie qu'elles peuvent être utilisées à la fois à l'intérieur et à l'extérieur du processus

Ensuite, créons les procédures stockées les plus simples.

CREATE PROCEDURE p1(IN x INT) 
BEGIN
  SELECT x;
END;

Variables

Les variables dans MySQL sont divisées en variables globales et variables locales.

Les variables globales commencent par @ et n'ont pas besoin d'être déclarées. Elles peuvent être utilisées directement. Par exemple, les variables locales

SET @name='gwx';

doivent être déclarées en premier. comme suit :

DECLARE x int DEFAULT 0;

Ensuite, nous Pour terminer un processus stocké : calculez le tarif en fonction de la distance, la distance dans un rayon de 3 kilomètres est calculée à 6 yuans et la distance au-delà est calculée à 1,2 yuans par kilomètre.

-- distance 路程
CREATE PROCEDURE p1(in distance FLOAT)
BEGIN
  DECLARE d_money FLOAT DEFAULT 0; 
    IF distance>3 THEN 
       SET d_money=6+(distance-3)*1.2;
    ELSE
      SET d_money=6;
    END IF;
    SELECT d_money;
END;

Curseur

Comparé à PHP, le curseur est un peu comme foreach, qui obtient un enregistrement à chaque boucle.

Définir un curseur :

declare 游标名 CURSOR FOR SELECT 语句

Ouvrir et fermer le curseur :

  • ouvrir le nom du curseur

  • fermer le nom du curseur

Obtenir les données du curseur :

FETCH 游标名 INTO 变量名

Il peut être introduit si simplement, mais tout le monde sera confus et ne saura pas comment l'utiliser. Examinons ensuite un exemple et apprenons à utiliser les curseurs de l'exemple.

Utilisez un curseur pour compléter une fonction très simple, qui consiste à additionner tous les nombres de la table test_cursor.

CREATE TABLE IF NOT EXISTS test_cursor(
  num1 INT(10) UNSIGNED NOT NULL DEFAULT 0,
  num2 INT(10) UNSIGNED NOT NULL DEFAULT 0
);    
INSERT INTO test_cursor(num1,num2) VALUES(1,1),(2,2),(3,3);
 
CREATE PROCEDURE `test_cursor`()
BEGIN
    DECLARE sum INT(10) DEFAULT 0;
    DECLARE n1,n2 INT(10);
    DECLARE done INT DEFAULT 0;
    
    DECLARE cur CURSOR FOR SELECT num1,num2 FROM test_cursor; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
    
    OPEN cur; -- 打开游标
    WHILE done=0 DO      
        FETCH cur INTO n1,n2;
        
        IF done=0 THEN -- 注意这里为什么加IF条件,不加的话,最后一个值会被多加一遍         
      SET sum=sum+n1+n2;
        END IF;
    END WHILE;
    CLOSE cur;  -- 关闭游标
    
    SELECT sum;
END

Il y a quelques points à noter ici. Tout d'abord, la définition des variables locales doit être déclarée avant de déclarer le curseur.

De plus, ici DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; signifie que done est défini sur 1 après la fin du curseur pour terminer la boucle.

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