在导入存储过程时经常遇见下列DECLARE报错的问题:

Error Code : 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

(0 ms taken)

有多少个DECLARE就会报多少次,然后后面就是取不到变量的报错。

这个原因是没有定义delimiter

如下的会报错:

CREATE PROCEDURE p8()

BEGIN

DECLARE a INT;

DECLARE b INT;

SET a = 5;

SET b = 5;

select pkid,name,userGroup_desc,parent_id,group_state from T_VSM_SECPOLICY_USERGROUP;

END;

错误信息:

Error Code : 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

(0 ms taken)

。。。。

添加了delimiter后就不报了

delimiter //

CREATE PROCEDURE p8()

BEGIN

DECLARE a INT;

DECLARE b INT;

SET a = 5;

SET b = 5;

declare cur0 cursor for select pkid from T_VSM_SECPOLICY_USERGROUP;  --这里为什么报错?

END//

具体原因可以查看mysql的官方手册

http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#declare-handlers

中的创建存储过程章节里的下列内容,不能被忽视了:

下面是一个使用OUT参数的简单的存储程序的例子。例子为,在 程序被定义的时候,用mysql客户端delimiter命令来把语句定界符从 ;变为//。这就允许用在 程序体中的;定界符被传递到服务器而不是被mysql自己来解释。

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)

-> BEGIN

->   SELECT COUNT(*) INTO param1 FROM t;

-> END

-> //

Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> CALL simpleproc(@a);

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;

+------+

| @a   |

+------+

| 3    |

+------+

1 row in set (0.00 sec)

当使用delimiter命令时,你应该避免使用反斜杠(‘\’)字符,因为那是MySQL的 转义字符。

下列是一个例子,一个采用参数的函数使用一个SQL函数执行一个操作,并返回结果:

mysql> delimiter //

mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)

-> RETURN CONCAT('Hello, ',s,'!');

-> //

Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> SELECT hello('world');

+----------------+

| hello('world') |

+----------------+

| Hello, world!  |

+----------------+

1 row in set (0.00 sec)

如果在存储函数中的RETURN语句返回一个类型不同于在函数的RETURNS子句中指定类型的值,返回值被强制为恰当的类型。比如,如果一个函数返回一个ENUM或SET值,但是RETURN语句返回一个整数,对于SET成员集的相应的ENUM成员,从函数返回的值是字符串。

还有后面的内容也说明了这个问题

20.2.7. BEGIN ... END复合语句

[begin_label:] BEGIN

[statement_list]

END [end_label]

存储子程序可以使用BEGIN ... END复合语句来包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。

复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的。

请注意,可选的[NOT] ATOMIC子句现在还不被支持。这意味着在指令块的开始没有交互的存储点被设置,并且在上下文中用到的BEGIN子句对当前交互动作没有影响。

使用多重语句需要客户端能发送包含语句定界符;的查询字符串。这个符号在命令行客户端被用delimiter命令来处理。改变查询结尾定界符;(比如改变为//)使得; 可被用在子程序体中。

总结起来就是因为存储过程里包含很多含缺省界定符号“;”的语句,如果不重新定义界定符的话,就只能以“;”为界定符一句一句的发给Mysql服务端解析,那么存储过程的第一句话肯定就语法错误了:

CREATE PROCEDURE p8()

BEGIN

DECLARE a INT;

然后后面的

DECLARE b INT;

也会报错,因为手册中规定DECLARE必须出现在BEGIN  和  EDN之间,且在其它所有语句之前。这个单独出现的DECLARE b INT;就会报语法错误了。

现在明白了吧。。。

mysql用declare会报错_mysql导入存储过程时declare报错的问题解决相关推荐

  1. mysql命令导入存储过程报错_mysql导入存储过程时declare报错的有关问题解决

    在导入存储过程时经常遇见下列DECLARE报错的问题: ? Error Code : 1064 You have an error in your SQL syntax; check the manu ...

  2. 命令行用impdp导入oracle时,报错ORA-02374: conversion error loading table “XXXX“.“XXXX“ ORA-12899: value……

    命令行用impdp导入oracle时,报错: ORA-02374: conversion error loading table "XXXX"."XXXX" O ...

  3. mysql修改路径报错_mysql修改数据存储路径报错处理

    Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' 解决?: >>> vim ...

  4. mysql导入数据报错_MySQL导入数据库时报错,MySQL server has go away

    MySQL server has gone away意思就是数据库挂了这个是因为导入数据导致mysql挂了,那么碰到数据库导入数据挂了要如何处理,下面来看看处理办法. 用mysqldump命令导出My ...

  5. python导入模块报错_Python 导入上层目录模块报错

    背景: 当前demo.py 文件,所处目录 D:\py\test\TestCase,需要调用test 目录下的模块,尝试了 新建__init__.py 文件+ import test.模块名的方法,无 ...

  6. mysql数据库导出后乱码问题_MySQL导入导出数据出现乱码的解决办法

    在mysql导入导出数据时经常出现中文乱码的问题,大多是因类导入导出时编码设置不一致所引起的.本文介绍了不同平台下的编码转换方法,供大家参考. 在linux系统中默认的是utf8编码,而windows ...

  7. mysql数据导入乱码怎么办_MYSQL导入数据时出现乱码怎么办

    MYSQL导入数据时出现乱码的解决办法:1.通过修改mysql安装文件中[my.ini]中参数解 决乱码问题:2.在命令行导入乱码解决:3.直接粘贴sql文件里的代码:4.用记事本或其他文本工 具改变 ...

  8. [ 报错记录 ]使用springboot时@Runwith报红

    只有菜鸟才会有的报错 比如我 问题描述 : @Runwith报红 尝试方法 : 反复导依赖没有用 有效方法 : @Runwith 改成 @RunWith w要大写 !!!

  9. 通过Navicat for MySQL导入数据时,日期时间错误问题解决办法

    通过 Navicat for MySQL数据库连接工具将 Excel 文件导入数据库时,发现日期出现了问题,日期列本来应该是2021/7/16,结果全部变成1900-01-20 问题原因 Navica ...

最新文章

  1. Android Dialog 弹出的时候标题栏闪烁一下的处理方法
  2. 二十二、插值查找算法
  3. Js 拦截全局ajax请求
  4. JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(上)
  5. 细说php--php学习必备
  6. 使用字节缓冲流在文件中写内容
  7. sqlserver excel,txt,access等文件的互導
  8. 优先级队列应用-称检测点查询
  9. 《.NET Core 2.0 应用程序高级调试》7折优惠
  10. [记录] --- linux安装redis
  11. 科大讯飞回应同传造假:人机耦合才是未来发展之道
  12. 微软将推出Surface Duo双屏手机:售价1399美元
  13. ubuntu14下搭建ssdb主从环境
  14. logback配置文件模板
  15. Atitit. 最佳实践 QA----降低cpu占有率--cpu占用太高怎么办
  16. android好用的窗口小工具下载,股票窗口小工具,安卓股票小插件
  17. 01 Python pikepdf 解锁带有密码的PDF文件
  18. 深度学习-图神经网络总结
  19. 蒙特卡罗(洛)方法及其在布丰投针试验中的应用(一)
  20. 非科班学弟如何转行斩获 ATM 大厂的 Offer ?

热门文章

  1. 【爬虫】使用requests爬取英雄联盟英雄皮肤
  2. Java学习篇四——分支(选择)结构之 if 语句块
  3. java计算机毕业设计音乐资源分享网站系统源码+数据库+系统+lw文档+部署
  4. 命令行启动安兔兔app
  5. 三星Gear VR体验:看 · 未来
  6. 苹果手机怎么追踪定位
  7. 关于Qt QObject tr(translate)失败的问题
  8. SQL注入之Quine注入
  9. [iOS]渐变毛玻璃效果
  10. 图片上传踩坑Uncaught (in promise) error