#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