Mysql 我不明白为什么我下面的代码出现语法错误。有人能帮我吗?

Mysql 我不明白为什么我下面的代码出现语法错误。有人能帮我吗?,mysql,cursor,declare,Mysql,Cursor,Declare,当我运行此代码时,出现以下错误: 错误1064 42000:您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 用于从中选择id的near“DECLARE cur CURSOR”的语法 第9行的资产cdn组合,其中cdn费用id=' 可能是因为: 仅允许在BEGIN中声明。。。结束复合语句 而且必须在开始时,在任何其他声明之前 …因此,该行可能会移动到该点上方的两个set语句之前 我相信如果修复了这个错误,您将遇到其他问题,因为我不知道当idq在该点之前声明,但未设置为任何值时

当我运行此代码时,出现以下错误:

错误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