过程语法错误

时间:2015-02-13 19:18:30

标签: mysql stored-procedures syntax-error

尝试在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;

这是返回错误的行的打印屏幕:

The errors

修改

当我在每个WHEN语句的末尾放置分号时,会发生这种情况:

Errors2

2 个答案:

答案 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中出现。也就是说,如果你在声明中保留这些表示,那么结束语需要语句分隔符之后。