如何使用 phpmyadmin 在存储过程中创建一段时间,错误 #1064

Posted

技术标签:

【中文标题】如何使用 phpmyadmin 在存储过程中创建一段时间,错误 #1064【英文标题】:How to make a while in a stored procedure with phpmyadmin, error #1064 【发布时间】:2016-12-22 05:16:21 【问题描述】:

我尝试在 phpmyadmin 中创建一个存储过程,但在第 12 行(WHILE 所在的位置)出现错误 1064。这是我第一次尝试创建存储过程。

BEGIN

DECLARE product_id INT;
DECLARE  product_min_age nvarchar(500);
DECLARE  cur CURSOR for
SELECT product_min_age, product_id FROM _vm_product;

open cur;

fetch next from cur into product_min_age, product_id;

while FETCH_STATUS = 0 BEGIN

    INSERT INTO _virtuemart_product_customfields (virtuemart_product_id, virtuemart_custom_id, customfield_value, customfield_params) VALUES
    ( product_id, 5, product_min_age, 'addEmpty=0|selectType=0|');

    fetch next from cur into product_min_age,product_id;
END;

close cur;

END

谢谢

【问题讨论】:

【参考方案1】:

您应该将其更改为以下内容。请参阅Documentation 了解更多信息。

open cur;

read_loop: LOOP
fetch cur into product_min_age, product_id;

    INSERT INTO _virtuemart_product_customfields (virtuemart_product_id, virtuemart_custom_id, customfield_value, customfield_params) VALUES
    ( product_id, 5, product_min_age, 'addEmpty=0|selectType=0|');

END LOOP;

close cur;

【讨论】:

@Rahul 谢谢,我还有一个问题。为什么当我尝试用前面的 @ 命名我的变量时出现错误。我看到很多人这样做,但对我来说,它不起作用。【参考方案2】:

如果有人想看我的最终结果:

BEGIN

DECLARE _product_id INT;
DECLARE  _product_min_age nvarchar(500);
DECLARE done INT DEFAULT 0;
DECLARE  cur CURSOR for SELECT product_min_age, product_id FROM _vm_product;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

open cur;
read_loop: LOOP
fetch cur into _product_min_age, _product_id;
    IF done = 1 THEN
        LEAVE read_loop;
    END IF;

    INSERT INTO _virtuemart_product_customfields (virtuemart_product_id, virtuemart_custom_id, customfield_value, customfield_params) VALUES
    ( _product_id, 5, _product_min_age, 'addEmpty=0|selectType=0|');

END LOOP;

close cur;

END

【讨论】:

【参考方案3】:

接受的答案确实是正确的,您自己的答案也是如此。不幸的是,这种方法完全错误!

除非万不得已,否则通常不会在循环内执行 sql 查询。选择/循环/插入实际上是人们编写他们的第一个存储过程时经常遵循的模式。但是有一个更好的方法,一个更好的方法。那就是INSERT .. SELECT

使用 INSERT ... SELECT,您可以快速将许多行插入到表中 从一张或多张桌子上。例如:

您的复杂存储过程简化为:

INSERT INTO _virtuemart_product_customfields (virtuemart_product_id, virtuemart_custom_id, customfield_value, customfield_params) 
SELECT product_id, 5, product_min_age, 'addEmpty=0|selectType=0|' 
FROM _vm_product

就是这样,只是一个简单的选择,没有存储过程!

第二个问题是您将分隔文本存储在列中。

  addEmpty=0|selectType=0|

我不太清楚你为什么要这样做,但这是最不寻常的。

【讨论】:

"addEmpty=0|selectType=0|" : 我需要这样做,因为我更新了 virtumart(电子商务的 joomla 组件)。我需要将旧结构与千种产品转换为新结构。我也不知道为什么,但是“addEmpty=0|selectType=0|”是该组件默认生成的值。 很高兴被使用

以上是关于如何使用 phpmyadmin 在存储过程中创建一段时间,错误 #1064的主要内容,如果未能解决你的问题,请参考以下文章

在 MySql/phpmyadmin 中创建存储过程

在 phpMyAdmin 中创建存储过程时,“错误 #1313 RETURN 只允许在 FUNCTION 中”

如何在 phpMyAdmin 中查看我的存储过程?

无法在 phpmyadmin 中创建程序

phpmyadmin 在创建存储过程时卡住了

SQL中如何从两张表中创建一张表