процедура mariadb для синтаксиса цикла

#for-loop #stored-procedures #mariadb

#для-цикла #хранимые процедуры #mariadb

Вопрос:

Почему эти процедуры не дают одинаковых результатов? Почему я получил ошибку 1329?

 CREATE TABLE TABA (A INT, B INT);
CREATE TABLE TABB (A INT, B INT);
INSERT INTO TABA VALUES (1, 11), (2, 22);
INSERT INTO TABB VALUES (1, 110), (2, 220);
  
 DROP PROCEDURE IF EXISTS testa;
DELIMITER //
CREATE PROCEDURE testa (IN tp1 INT)
 BEGIN
  FOR fp1 IN (SELECT TABA.A FROM TABA WHERE TABA.B LIKE tp1)
  DO
   SELECT * FROM TABB WHERE TABB.A LIKE fp1;
  END FOR;
 END;
//
DELIMITER ;
  
 DROP PROCEDURE IF EXISTS testb;
DELIMITER //
CREATE PROCEDURE testb (IN tp1 INT)
 BEGIN
  DECLARE fp1 INT;
  DECLARE cur1 CURSOR FOR SELECT TABA.A FROM TABA WHERE TABA.B LIKE tp1;
  OPEN cur1;
  loopa: LOOP
  FETCH cur1 INTO fp1;
   SELECT * FROM TABB WHERE TABB.A LIKE fp1;
 END LOOP;
 CLOSE cur1;
END; 
//
DELIMITER ;
  
 CALL testa(11);
ERROR 1241 (21000): Operand should contain 1 column(s)
  
 CALL testb(11);
 ------ ------ 
| A    | B    |
 ------ ------ 
|    1 |  110 |
 ------ ------ 
1 row in set (0.000 sec)

ERROR 1329 (02000): No data - zero rows fetched, selected, or processed
  

Я думал, что получил аналогичный результат. Если я запускаю два оператора SELECT вручную, они работают.

Спасибо

Комментарии:

1. Синтаксис SP является загадочным и древним. Прочитайте документы еще немного.

2. Я уже прочитал кое-что из базы знаний MariaDB. В конце я использовал синтаксис курсора, но мне было любопытно узнать, как работает цикл.

3. FOR является новым в 10.3: mariadb.com/kb/en/for