如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章