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

Comment convertir un curseur SQL Server en équivalent MySQL

L'équivalent MySQL serait quelque chose comme ça :

BEGIN
  DECLARE CurrentFirstName VARCHAR(300);
  DECLARE CurrentAge INT;
  DECLARE done INT DEFAULT FALSE;
  DECLARE CursorName CURSOR FOR
    SELECT FirstName, Age FROM Customers;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN CursorName;
  myloop: LOOP
    FETCH CursorName INTO CurrentFirstName, CurrentAge;
    IF done THEN
      LEAVE myloop;
    END IF;
    IF CurrentAge > 60 THEN
      insert into ElderCustomers values (CurrentFirstName,CurrentAge);
    END IF;
  END LOOP;
  CLOSE CursorName;
END;

La grande différence réside dans la boucle, en utilisant le CONTINUE HANDLER pour définir un indicateur lorsqu'il n'y a plus de lignes à récupérer et en sortant de la boucle lorsque l'indicateur est défini. (Cela a l'air moche, mais c'est comme ça dans MySQL.)

Cet exemple soulève la question de savoir pourquoi cela n'est pas écrit (plus efficacement, à la fois dans SQL Server et MySQL) comme :

INSERT INTO ElderCustomers (FirstName, Age)
SELECT FirstName, Age
  FROM Customers
 WHERE Age > 60