Mysql
 sql >> база данни >  >> RDS >> Mysql

Извикайте съхранена процедура за всеки ред, върнат от заявка в MySQL

Понятия като „цикли“ (for-each, while и т.н.) и „разклоняване“ (if-else, call и т.н.) са процедурни и не съществуват в декларативно езици като SQL. Обикновено човек може да изрази желания резултат по декларативен начин, което би било правилният начин за решаване на този проблем.

Например, ако testProc процедурата, която трябва да бъде извикана, използва дадения id като ключ за търсене в друга таблица, тогава бихте могли (и трябва) вместо това просто JOIN вашите таблици заедно – например:

SELECT ...
FROM   objects JOIN other USING (id)
WHERE  ...

Само в изключително редките ситуации, когато проблемът ви не може да бъде изразен декларативно, трябва да прибягвате до процедурно разрешаване. Съхранени процедури са единственият начин за изпълнение на процедурен код в MySQL. Така че или трябва да модифицирате съществуващия си sproc, така че да изпълнява текущата си логика в рамките на цикъл, или да създадете нов sproc, който извиква съществуващия ви от цикъл:

CREATE PROCEDURE foo() BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _id BIGINT UNSIGNED;
  DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  testLoop: LOOP
    FETCH cur INTO _id;
    IF done THEN
      LEAVE testLoop;
    END IF;
    CALL testProc(_id);
  END LOOP testLoop;

  CLOSE cur;
END



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Отрязване на резултатите от груповите конкат

  2. UNPIVOT mysql данни към друга таблица

  3. Как да актуализирате автоматично данни в базата данни в PHP

  4. Как да заявя sql с активен запис за дати между определени времена

  5. Грешка 1046 Няма избрана база данни, как да се разреши?