Mysql
 sql >> Database >  >> RDS >> Mysql

Come convertire un cursore di SQL Server nell'equivalente di MySQL

L'equivalente di MySQL sarebbe qualcosa del genere:

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 differenza è nel ciclo, utilizzando il CONTINUE HANDLER per impostare un flag quando non ci sono più righe da recuperare e uscire dal ciclo quando il flag è impostato. (Sembra brutto, ma è così che si fa in MySQL.)

Questo esempio pone la domanda perché questo non è scritto (in modo più efficiente, sia in SQL Server che in MySQL) come:

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