Mysql 我不明白为什么我下面的代码出现语法错误。有人能帮我吗?
当我运行此代码时,出现以下错误: 错误1064 42000:您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 用于从中选择id的near“DECLARE cur CURSOR”的语法 第9行的资产cdn组合,其中cdn费用id=' 可能是因为: 仅允许在BEGIN中声明。。。结束复合语句 而且必须在开始时,在任何其他声明之前 …因此,该行可能会移动到该点上方的两个set语句之前 我相信如果修复了这个错误,您将遇到其他问题,因为我不知道当idq在该点之前声明,但未设置为任何值时,您希望查询检索什么 ===== 更新: 下面是一个来自前面关于完全消除游标的可能性的评论的示例。试试这个:Mysql 我不明白为什么我下面的代码出现语法错误。有人能帮我吗?,mysql,cursor,declare,Mysql,Cursor,Declare,当我运行此代码时,出现以下错误: 错误1064 42000:您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 用于从中选择id的near“DECLARE cur CURSOR”的语法 第9行的资产cdn组合,其中cdn费用id=' 可能是因为: 仅允许在BEGIN中声明。。。结束复合语句 而且必须在开始时,在任何其他声明之前 …因此,该行可能会移动到该点上方的两个set语句之前 我相信如果修复了这个错误,您将遇到其他问题,因为我不知道当idq在该点之前声明,但未设置为任何值时
DELIMITER ##
create trigger tra_Price after update on assets_cdn_charge for each row
begin
declare res int;
declare ids int;
declare idq int;
declare idt int;
set res = (select price from assets_cdn_charge where price = new.price);
set ids = (select id from assets_cdn_charge where price = new.price);
DECLARE cur CURSOR FOR SELECT id FROM assets_cdn_composite WHERE cdn_charge_id = ids;
open cur;
ins_loop:LOOP
fetch cur into idq;
declare curs cursor for select id from assets_cdn_traffic where domain_name_id = idq;
open curs;
ins1_loop:LOOP
fetch curs into idt;
update assets_cdn_traffic set cost = traffic * res where domain_namd_id = idt;
end LOOP;
close curs;
end LOOP;
close cur;
END; ##
但是,在触发器中使用之前,我会单独尝试更新查询,以确保它按预期工作。用测试值替换NEW.price和NEW.id以验证处理。感谢您的回答,我犯了一个错误,idq必须是declare curs curs cursor处的id,用于从资产中选择id\u cdn\u traffic,其中domain\u name\u id=idq;好的,但是你在这条线路上还是会有问题的。根据文档,所有DECLARE语句都必须出现在开头。另外,你这里还有一个输入错误:domain\u namd\u id谢谢你的帮助,我明白了,可能我可以用left-join。left-join要什么。。。无论如何,我认为您可以简化查询,至少少一个查询,和/或甚至可能完全避免使用游标,但这需要一些努力。因为我有三个表,它们是关系表,所以我必须使用left join.like:DECLARE CURSOR FOR SELECT assets\u cdn\u traffic.id FROM assets\u cdn\u traffic left join assets\u cdn\u composite\u cdn\u traffic.domain\u namd\u id=assets\u cdn\u composite.id left joinselect*FROM assets\u cdn\u charge,其中price=new.price on assets\u cdn\u composite.cdn\u charge\u charge=id=assets.id=assets\u cdn\n\u charge=;
BEGIN
UPDATE assets_cdn_traffic
JOIN assets_cdn_composite ON assets_cdn_traffic.domain_name_id = assets_cdn_composite.cdn_charge_id
JOIN assets_cdn_charge ON assets_cdn_charge.id = assets_cdn_composite.cdn_charge_id
SET cost = traffic * NEW.price
WHERE assets_cdn_charge.id = NEW.id
END