Объявить ошибку mariaDB. Как можно исправить этот запрос?

Я пытаюсь заполнить таблицу несколькими столбцами из другой таблицы с идентификатором, но я получил эту ошибку:

1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с типом продуктов.CategoryIDID; ОБЪЯВЛЯЙТЕ тип продукции t_productid.ProductID;' в строке 4

Я не знаю, как это исправить, надеюсь, вы мне поможете.

 DELIMITER //
 Create procedure getProducts(v_categoryid int)
 BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE t_categoryid type of products.CategoryID;
    DECLARE t_productid type of products.ProductID;
    DECLARE t_productname type of products.ProductName;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    DECLARE cur1 CURSOR(p_categoryid int)
    FOR
    SELECT CategoryID, ProductID, ProductName 
    FROM products
    WHERE CategoryID = p_categoryid; 

    create table IF NOT exists curProducts(
    CategoryID int(10),
    ProductID int(10),
    ProductName varchar(40));

    truncate table curProducts;
    open cur1(v_categoryid);
    read_loop: LOOP
       FETCH cur1 INTO t_categoryid, t_productid, t_productname;
       IF done THEN
          LEAVE read_loop;
       END IF;
       INSERT INTO curProducts VALUES (t_categoryid, t_productid, t_productname);
    END LOOP;
    close cur1;

    select * from curProducts;
END // 
DELIMITER ;

2 ответа

Решение

Вы можете использовать явные типы или обновить до mariadb-10.3, где TYPE OF Синтаксис был введен.

Это решение позволяет избежать синтаксической ошибки, так как эти операторы не нужны!

DECLARE done INT DEFAULT FALSE;
DECLARE t_categoryid type of products.CategoryID;
DECLARE t_productid type of products.ProductID;
DECLARE t_productname type of products.ProductName;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
DECLARE cur1 CURSOR(p_categoryid int)
FOR
SELECT CategoryID, ProductID, ProductName 
FROM products
WHERE CategoryID = p_categoryid; 

open cur1(v_categoryid);
read_loop: LOOP
   FETCH cur1 INTO t_categoryid, t_productid, t_productname;
   IF done THEN
      LEAVE read_loop;
   END IF;
   INSERT INTO curProducts VALUES (t_categoryid, t_productid, t_productname);
END LOOP;
close cur1;

Все это можно заменить просто

INSERT INTO curProducts VALUES (t_categoryid, t_productid, t_productname)
    SELECT CategoryID, ProductID, ProductName 
    FROM products
    WHERE CategoryID = p_categoryid; 
Другие вопросы по тегам