mysql用declare会报错_mysql导入存储过程时declare报错的问题解决
在导入存储过程时经常遇见下列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报错的问题解决相关推荐
- mysql命令导入存储过程报错_mysql导入存储过程时declare报错的有关问题解决
在导入存储过程时经常遇见下列DECLARE报错的问题: ? Error Code : 1064 You have an error in your SQL syntax; check the manu ...
- 命令行用impdp导入oracle时,报错ORA-02374: conversion error loading table “XXXX“.“XXXX“ ORA-12899: value……
命令行用impdp导入oracle时,报错: ORA-02374: conversion error loading table "XXXX"."XXXX" O ...
- mysql修改路径报错_mysql修改数据存储路径报错处理
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' 解决?: >>> vim ...
- mysql导入数据报错_MySQL导入数据库时报错,MySQL server has go away
MySQL server has gone away意思就是数据库挂了这个是因为导入数据导致mysql挂了,那么碰到数据库导入数据挂了要如何处理,下面来看看处理办法. 用mysqldump命令导出My ...
- python导入模块报错_Python 导入上层目录模块报错
背景: 当前demo.py 文件,所处目录 D:\py\test\TestCase,需要调用test 目录下的模块,尝试了 新建__init__.py 文件+ import test.模块名的方法,无 ...
- mysql数据库导出后乱码问题_MySQL导入导出数据出现乱码的解决办法
在mysql导入导出数据时经常出现中文乱码的问题,大多是因类导入导出时编码设置不一致所引起的.本文介绍了不同平台下的编码转换方法,供大家参考. 在linux系统中默认的是utf8编码,而windows ...
- mysql数据导入乱码怎么办_MYSQL导入数据时出现乱码怎么办
MYSQL导入数据时出现乱码的解决办法:1.通过修改mysql安装文件中[my.ini]中参数解 决乱码问题:2.在命令行导入乱码解决:3.直接粘贴sql文件里的代码:4.用记事本或其他文本工 具改变 ...
- [ 报错记录 ]使用springboot时@Runwith报红
只有菜鸟才会有的报错 比如我 问题描述 : @Runwith报红 尝试方法 : 反复导依赖没有用 有效方法 : @Runwith 改成 @RunWith w要大写 !!!
- 通过Navicat for MySQL导入数据时,日期时间错误问题解决办法
通过 Navicat for MySQL数据库连接工具将 Excel 文件导入数据库时,发现日期出现了问题,日期列本来应该是2021/7/16,结果全部变成1900-01-20 问题原因 Navica ...
最新文章
- Android Dialog 弹出的时候标题栏闪烁一下的处理方法
- 二十二、插值查找算法
- Js 拦截全局ajax请求
- JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(上)
- 细说php--php学习必备
- 使用字节缓冲流在文件中写内容
- sqlserver excel,txt,access等文件的互導
- 优先级队列应用-称检测点查询
- 《.NET Core 2.0 应用程序高级调试》7折优惠
- [记录] --- linux安装redis
- 科大讯飞回应同传造假:人机耦合才是未来发展之道
- 微软将推出Surface Duo双屏手机:售价1399美元
- ubuntu14下搭建ssdb主从环境
- logback配置文件模板
- Atitit. 最佳实践 QA----降低cpu占有率--cpu占用太高怎么办
- android好用的窗口小工具下载,股票窗口小工具,安卓股票小插件
- 01 Python pikepdf 解锁带有密码的PDF文件
- 深度学习-图神经网络总结
- 蒙特卡罗(洛)方法及其在布丰投针试验中的应用(一)
- 非科班学弟如何转行斩获 ATM 大厂的 Offer ?