错误1064(42000):您的SQL语法有错误;检查手动mysql存储过程错误

错误1064(42000):您的SQL语法有错误;检查手动mysql存储过程错误,mysql,Mysql,我正在尝试mysql存储过程,但出现以下错误: 错误1064(42000):您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 使用near'的语法 为声明cur游标 从员工中选择出生日期 “在3号线 代码: 分隔符// 创建过程getminmaxbirthdate(OUT minage date,OUT maxage date) 开始 宣布迈索法尔、马克索法尔、策展人完成; 为声明cur游标 从员工中选择出生日期; 设置minsofar=2040-12-12; 设置maxso

我正在尝试mysql存储过程,但出现以下错误:

错误1064(42000):您的SQL语法有错误;检查 与右边的MySQL服务器版本相对应的手册 使用near'的语法

为声明cur游标 从员工中选择出生日期

“在3号线

代码:

分隔符//
创建过程getminmaxbirthdate(OUT minage date,OUT maxage date)
开始
宣布迈索法尔、马克索法尔、策展人完成;
为声明cur游标
从员工中选择出生日期;
设置minsofar=2040-12-12;
设置maxsofar=0;
设置完成=0;
找不到的声明继续处理程序
设置完成=1;
开放cur;
完成时=0执行
把生日带进牧师馆;
如果curage>maxsofar,则
设置maxsofar=curage;
如果结束;
如果教区
您的代码中有一些错误

  • 没有类型的声明无效
  • 只有在声明后才能设置
  • 你的生日不是生日吗
您必须检查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 ; 
分隔符//
创建过程getminmaxbirthdate(OUT minage date,OUT maxage date)
开始
宣布米索法尔、马克索法尔、库拉奇、杜瓦查尔(10);
为声明cur游标
从员工中选择出生日期;
找不到的声明继续处理程序
设置完成=1;
设置minsofar=2040-12-12;
设置maxsofar=0;
设置完成=0;
开放cur;
完成时=0执行
把cur带进牧师室;
如果curage>maxsofar,则
设置maxsofar=curage;
如果结束;
如果教区定界符您的代码中有一些错误

  • 没有类型的声明无效
  • 只有在声明后才能设置
  • 你的生日不是生日吗
您必须检查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 ; 
分隔符//
创建过程getminmaxbirthdate(OUT minage date,OUT maxage date)
开始
宣布米索法尔、马克索法尔、库拉奇、杜瓦查尔(10);
为声明cur游标
从员工中选择出生日期;
找不到的声明继续处理程序
设置完成=1;
设置minsofar=2040-12-12;
设置maxsofar=0;
设置完成=0;
开放cur;
完成时=0执行
把cur带进牧师室;
如果curage>maxsofar,则
设置maxsofar=curage;
如果结束;
如果教区
不使用简单查询有什么原因吗

select min(birth_date), max(birth_date)
from employee;
这可以合并到存储过程中,但这似乎是多余的。使用游标只是一种非常非常糟糕的做法——即使您正在学习SQL。应该避免使用游标,除非在必要的情况下——例如调用存储过程或为每行调用动态SQL


您的代码似乎也混淆了“年龄”和“日期”。有点不清楚您真正想要完成什么。

您不使用简单查询有什么原因吗

select min(birth_date), max(birth_date)
from employee;
这可以合并到存储过程中,但这似乎是多余的。使用游标只是一种非常非常糟糕的做法——即使您正在学习SQL。应该避免使用游标,除非在必要的情况下——例如调用存储过程或为每行调用动态SQL


您的代码似乎也混淆了“年龄”和“日期”。有点不清楚您真正想要实现什么。

为什么要使用存储过程来实现这一点?您可以通过直接的SQL查询获得所需的信息。@GMB我正在学习为什么要使用存储过程来实现这一点?您可以通过直接的SQL查询获得所需的信息。@GMB我只是在学习我只想输出最小年龄和最大年龄age@SugumarVenkatesan . . . 从最小和最大出生日期计算年龄。我只想输出最小年龄和最大年龄age@SugumarVenkatesan . . . 只需从最小和最大出生日期计算年龄。