【问题标题】:MySQL Store Procedure Error Code: 1064MySQL 存储过程错误代码:1064
【发布时间】:2018-06-21 23:32:44
【问题描述】:

我正在尝试创建存储过程并收到错误:

错误代码:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的 'DECLARE @LoopCounter INT DEFAULT 0; 附近使用的语法宣布 @MaxId INT 默认值 0; DECLARE ' 在第 21 行

DELIMITER $$
USE dollar$$
DROP PROCEDURE IF EXISTS sp_get_products_google_feed$$
CREATE DEFINER=root@localhost PROCEDURE sp_get_products_google_feed()
BEGIN
        DROP TABLE IF EXISTS tmp_Product_List;
        CREATE TEMPORARY TABLE tmp_Product_List(
            SELECT DISTINCT p.products_id AS PID, p.products_model AS ID, pd.products_name AS Title, pd.products_description AS Description, 
            '' AS Google_product_category, '' AS product_type, p.products_model AS link, p.products_image AS Image_link,
            'new' AS Condition1, 'in stock' AS Availability, p.products_price AS Price, '' AS Sale_Price, '' AS Sale_price_effective_date,
            p.products_upc AS GTin, p.manufacturers_id, '' AS MPN, '' AS Item_group_id, '' AS Gender, '' AS Age_group, '' AS Color, '' AS Size,
            'Free' AS Shipping, '' AS Shipping_Weight 
            FROM 
            zc_products_to_categories pc, zc_products p, zc_products_description pd  WHERE 
            pc.categories_id IN 
            (SELECT DISTINCT mg.sub_category_id AS id FROM tbl_map_google_category_master mg WHERE mg.category_id = 1 
            UNION
            SELECT DISTINCT mg.sub_sub_category_id  AS id FROM tbl_map_google_category_master mg WHERE mg.category_id = 1
            ORDER BY id) AND
            p.products_id = pc.products_id AND
            p.products_id = pd.products_id  AND
            p.products_status = 1 ORDER BY PID);

            DECLARE @LoopCounter INT DEFAULT 0;
            DECLARE @MaxId INT DEFAULT 0;
            DECLARE @GoogleCategoryid INT DEFAULT 0;

            SELECT @LoopCounter = MIN(PID), @MaxId = MAX(PID) FROM tmp_Product_List;

            WHILE (@LoopCounter IS NOT NULL AND @LoopCounter <= @MaxId)
            BEGIN
                SELECT @GoogleCategoryid = google_category_id FROM tbl_map_google_category_master 
                WHERE 
                category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = @LoopCounter) OR 
                sub_category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = @LoopCounter) OR 
                sub_sub_category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = @LoopCounter) LIMIT 0,1;

                UPDATE tmp_Product_List SET Google_product_category = @GoogleCategoryid WHERE products_id = @LoopCounter;

                SET @LoopCounter  = @LoopCounter  + 1               
                IF(@@ROWCOUNT = 0 )
                BEGIN
                    SET @LoopCounter  = @LoopCounter  + 1 
                    CONTINUE
                END
            END

            SELECT * FROM tmp_Product_List;
    END$$
DELIMITER ;

但如果我从脚本中删除以下代码,它会成功运行。试图在完整脚本中找到错误但没有运气。

            DECLARE @LoopCounter INT DEFAULT 0;
            DECLARE @MaxId INT DEFAULT 0;
            DECLARE @GoogleCategoryid INT DEFAULT 0;

            SELECT @LoopCounter = MIN(PID), @MaxId = MAX(PID) FROM tmp_Product_List;

            WHILE (@LoopCounter IS NOT NULL AND @LoopCounter <= @MaxId)
            BEGIN
                SELECT @GoogleCategoryid = google_category_id FROM tbl_map_google_category_master 
                WHERE 
                category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = @LoopCounter) OR 
                sub_category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = @LoopCounter) OR 
                sub_sub_category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = @LoopCounter) LIMIT 0,1;

                UPDATE tmp_Product_List SET Google_product_category = @GoogleCategoryid WHERE products_id = @LoopCounter;

                SET @LoopCounter  = @LoopCounter  + 1               
                IF(@@ROWCOUNT = 0 )
                BEGIN
                    SET @LoopCounter  = @LoopCounter  + 1 
                    CONTINUE
                END
            END

【问题讨论】:

  • 将您的 DECLARE 语句移到 BEGIN 的正下方。我相信 MySQL 对首先声明变量很有趣。
  • 谢谢,但还是同样的错误。

标签: mysql stored-procedures


【解决方案1】:

我已经解决了一些问题。

第一个是声明变量前带有@符号,我已经删除了。

第二个是在 WHILE ... BEGIN ... END 中。语法是 WHILE ... DO ... END WHILE。

第三个是 IF(@@ROWCOUNT) 之前缺少的分号。

下面我没有解决的最后一个问题是@@ROWCOUNT 的使用。 @@ROWCOUNT 不是 MySQL 中的变量。你可以找到替代品here

DELIMITER $$
USE dollar$$
DROP PROCEDURE IF EXISTS sp_get_products_google_feed$$
CREATE DEFINER=root@localhost PROCEDURE sp_get_products_google_feed()
    BEGIN
        DECLARE LoopCounter INT DEFAULT 0;
        DECLARE MaxId INT DEFAULT 0;
        DECLARE GoogleCategoryid INT DEFAULT 0;
    DROP TABLE IF EXISTS tmp_Product_List;
    CREATE TEMPORARY TABLE tmp_Product_List(
        SELECT DISTINCT p.products_id AS PID, p.products_model AS ID, pd.products_name AS Title, pd.products_description AS Description, 
        '' AS Google_product_category, '' AS product_type, p.products_model AS link, p.products_image AS Image_link,
        'new' AS Condition1, 'in stock' AS Availability, p.products_price AS Price, '' AS Sale_Price, '' AS Sale_price_effective_date,
        p.products_upc AS GTin, p.manufacturers_id, '' AS MPN, '' AS Item_group_id, '' AS Gender, '' AS Age_group, '' AS Color, '' AS Size,
        'Free' AS Shipping, '' AS Shipping_Weight 
        FROM 
        zc_products_to_categories pc, zc_products p, zc_products_description pd  WHERE 
        pc.categories_id IN 
        (SELECT DISTINCT mg.sub_category_id AS id FROM tbl_map_google_category_master mg WHERE mg.category_id = 1 
        UNION
        SELECT DISTINCT mg.sub_sub_category_id  AS id FROM tbl_map_google_category_master mg WHERE mg.category_id = 1
        ORDER BY id) AND
        p.products_id = pc.products_id AND
        p.products_id = pd.products_id  AND
        p.products_status = 1 ORDER BY PID);



        SELECT LoopCounter = MIN(PID), MaxId = MAX(PID) FROM tmp_Product_List;

        WHILE (LoopCounter IS NOT NULL AND LoopCounter <= MaxId)
        DO
            SELECT GoogleCategoryid = google_category_id FROM tbl_map_google_category_master 
            WHERE 
            category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = LoopCounter) OR 
            sub_category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = LoopCounter) OR 
            sub_sub_category_id = (SELECT MAX(categories_id) FROM zc_products_to_categories WHERE products_id = LoopCounter) LIMIT 0,1;

            UPDATE tmp_Product_List SET Google_product_category = GoogleCategoryid WHERE products_id = LoopCounter;

            SET LoopCounter  = LoopCounter  + 1;               
            IF(@@ROWCOUNT = 0 )
            BEGIN
                SET LoopCounter  = LoopCounter  + 1 
                CONTINUE
            END
        END WHILE

        SELECT * FROM tmp_Product_List;
END$$
DELIMITER ;

【讨论】:

  • 我试过但没有运气。即使我从脚本中删除了 IF(@@ROWCOUNT) 条件,仍然与我在上面发布的错误相同。看来,我现在必须使用 PHP 脚本来处理这部分,因为这对我来说很容易,而不是在其中发现错误。无论如何谢谢:)
猜你喜欢
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
相关资源
最近更新 更多