尝试在MySQL上创建过程时遇到以下错误:
错误代码:1064。您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以便在'insert into objetivo.historico(id_aluno,id_turma,ano,bim1)值附近使用正确的语法(a_id,a_t'在第5行
以及该程序的其他几个方面。问题是我无法看到我在哪里犯了错误,因为错误的代码的某些部分在程序上重复而没有错误。
这是简单的代码:
create procedure objetivo.p_atu_historico (in a_id integer, in a_turma
integer, in a_data date, in a_nota double, in a_bim integer)
begin
if(select count(id) from objetivo.historico where id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y') )= 0 then
CASE a_bim
WHEN 1 THEN (insert into objetivo.historico (id_aluno, id_turma, ano, bim1) values (a_id, a_turma, Format(a_data, '%Y'), a_nota))
WHEN 2 THEN (insert into objetivo.historico (id_aluno, id_turma, ano, bim2) values (a_id, a_turma, Format(a_data, '%Y'), a_nota))
WHEN 3 THEN (insert into objetivo.historico (id_aluno, id_turma, ano, bim3) values (a_id, a_turma, Format(a_data, '%Y'), a_nota))
WHEN 4 THEN (insert into objetivo.historico (id_aluno, id_turma, ano, bim4) values (a_id, a_turma, Format(a_data, '%Y'), a_nota))
END CASE;
ELSEIF (select count(id) from objetivo.historico where id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y')) <> 0 THEN
CASE a_bim
WHEN 1 THEN (UPDATE objetivo.historico SET bim1 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y'))
WHEN 2 THEN (UPDATE objetivo.historico SET bim2 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y'))
WHEN 3 THEN (UPDATE objetivo.historico SET bim3 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y'))
WHEN 4 THEN (UPDATE objetivo.historico SET bim4 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y'))
END CASE;
END IF;
end;
这是返回错误的行的打印屏幕:
修改
当我在每个WHEN语句的末尾放置分号时,会发生这种情况:
答案 0 :(得分:1)
您的过程中出现语法错误。您需要删除额外的括号并在每个语句后插入分号。像这样:
create procedure objetivo.p_atu_historico (in a_id integer, in a_turma
integer, in a_data date, in a_nota double, in a_bim integer)
begin
if(select count(id) from objetivo.historico where id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y') )= 0 then
CASE a_bim
WHEN 1 THEN insert into objetivo.historico (id_aluno, id_turma, ano, bim1) values (a_id, a_turma, Format(a_data, '%Y'), a_nota);
WHEN 2 THEN insert into objetivo.historico (id_aluno, id_turma, ano, bim2) values (a_id, a_turma, Format(a_data, '%Y'), a_nota);
WHEN 3 THEN insert into objetivo.historico (id_aluno, id_turma, ano, bim3) values (a_id, a_turma, Format(a_data, '%Y'), a_nota);
WHEN 4 THEN insert into objetivo.historico (id_aluno, id_turma, ano, bim4) values (a_id, a_turma, Format(a_data, '%Y'), a_nota);
END CASE;
ELSEIF (select count(id) from objetivo.historico where id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y')) <> 0 THEN
CASE a_bim
WHEN 1 THEN UPDATE objetivo.historico SET bim1 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y');
WHEN 2 THEN UPDATE objetivo.historico SET bim2 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y');
WHEN 3 THEN UPDATE objetivo.historico SET bim3 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y');
WHEN 4 THEN UPDATE objetivo.historico SET bim4 = a_nota WHERE id_aluno = a_id and id_turma = a_turma and ano = Format(a_data, '%Y');
END CASE;
END IF;
end;
答案 1 :(得分:1)
存储程序中的语句需要以分号结束。
CASE a_bim
WHEN 1 THEN
insert into ... ;
-- ^
WHEN 2 THEN
...
END CASE;
-- ^
要创建包含分号的存储过程,您需要将会话的语句分隔符更改为除分号之外的某个字符串。这将允许整个CREATE
语句被视为单个语句。只要确定您选择的分隔符字符串,分隔符字符串只出现在语句的末尾,并且不会出现在CREATE PROCEDURE
语句中的任何位置。例如:
DELIMITER $$
CREATE PROCEDURE myproc
BEGIN
SET @a := 1;
END$$
DELIMITER ;
修改强>
WHEN
不是CASE
声明中的一部分声明。
INSERT
是一个声明,而且是需要终止的声明。你在INSERT
陈述周围的parens是多余的,他们没有任何目的。 (我不认为这是一个语法错误,但我对此并不确定,我以前从未尝试过这样做......将语句包含在不必要的语句中。
在您的示例中,分号必须遵循INSERT
语句,该语句在 a paren中出现。也就是说,如果你在声明中保留这些表示,那么结束语需要在语句分隔符之后。