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

So konvertieren Sie einen SQL Server-Cursor in ein MySQL-Äquivalent

Das MySQL-Äquivalent wäre etwa so:

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;

Der große Unterschied liegt in der Schleife, bei der der CONTINUE HANDLER verwendet wird, um ein Flag zu setzen, wenn keine Zeilen mehr abgerufen werden können, und die Schleife verlassen wird, wenn das Flag gesetzt ist. (Das sieht hässlich aus, aber so wird es in MySQL gemacht.)

Dieses Beispiel wirft die Frage auf, warum dies nicht (effizienter, sowohl in SQL Server als auch in MySQL) geschrieben wird als:

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