ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство mysql ошибка хранимой процедуры - PullRequest
0 голосов
/ 01 августа 2020

Я просто пробую mysql хранимую процедуру, но получаю следующую ошибку:

ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с ';

DECLARE cur CURSOR для выбора даты рождения от сотрудников;

' в строке 3

Код:

delimiter //
create procedure getminmaxbirthdate(OUT minage date,OUT maxage date)
    begin
        DECLARE minsofar,maxsofar,curage,done;

        DECLARE cur CURSOR for
            select birth_date from employees;

        set minsofar = 2040-12-12;
        set maxsofar = 0;
        set done = 0;

        DECLARE continue handler for not found
            set done = 1;

        open cur;
            while done = 0 do
                fetch birthdate into curage;
                if curage > maxsofar then
                    set maxsofar = curage;
                end if;
                if curage < minsofar then
                    set minsofar = curage;
                end if;
            end while;    
        close cur;

        set minage = minsofar;
        set maxage = maxsofar;
    end //
delimiter ;   
    

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Есть ли причина, по которой вы не используете простой запрос?

select min(birth_date), max(birth_date)
from employee;

Этот мог бы быть включен в хранимую процедуру, но это кажется излишним. Использование курсора - это действительно, действительно, очень плохая практика, даже если вы изучаете SQL. Курсоров следует избегать, за исключением ситуаций, когда они необходимы - например, при вызове хранимой процедуры или вызове динамического c SQL для каждой строки.

Ваш код также, кажется, смешивает "возрасты" "и" даты ". Немного неясно, чего вы действительно хотите достичь sh.

1 голос
/ 01 августа 2020

В вашем коде есть некоторые ошибки

  • DECLARE без tyoe is nocht valid
  • SET возможны только после DECLARE
  • и ваш CORSOR не работает дата рождения

вы должны проверить типы данных для minsofar, maxsofar, curage, done

хранимая процедура:

   delimiter //
 create procedure getminmaxbirthdate(OUT minage date,OUT maxage date)
    begin
        DECLARE minsofar,maxsofar,curage,done VARCHAR(10);

        DECLARE cur CURSOR for
            select birth_date from employees;
            
        DECLARE continue handler for not found
            set done = 1;

        set minsofar = 2040-12-12;
        set maxsofar = 0;
        set done = 0;


        open cur;
            while done = 0 do
                fetch cur into curage;
                if curage > maxsofar then
                    set maxsofar = curage;
                end if;
                if curage < minsofar then
                    set minsofar = curage;
                end if;
            end while;    
        close cur;

        set minage = minsofar;
        set maxage = maxsofar;
    end //
delimiter ; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...