问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

linux下mysql用declare报错,怎么解决啊?

发布网友 发布时间:2022-04-07 21:10

我来回答

1个回答

热心网友 时间:2022-04-07 22:39

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-proceres.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;就会报语法错误了。

现在明白了吧。。。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
嘴巴是黄色的两鬓各一处白色羽毛肚子是灰白色羽毛腿是黄色的 鸟儿对我们有哪些好处? ...是怎么回事?汽车启动时在驾驶舱听到响声,好似拖拉机烟囱里发出... 软电脑各个时代的开机画面如何设置电脑开机画面 ...器空间、外部数据存储器空间和位地址空间的 饿了么微信支付怎么开通 微信支付开通方式分享 饿了么怎样绑定微信? 梦见不认识的拘给它洗澡身上长蛆 与朋友交而不信乎信的意思是什么 与朋友交而不信乎信的意思 浙江农信如何查询余额 查询余额方法 现代汉语和古代汉语的所必须掌握的基本点和重点? 文言文中的语法现象和句式。 什么叫词类活用 语文中什么使动用法,意动,还有什么动,那个能不能帮忙解释一下 ?谢谢 什么是名词的意动用法 古代汉语词类活用现象有哪几种? 使动用法和意动用法的异同点是什么?注意是异同,不单单是区别。_百度知... 文言文中使动与意动用法的使用规律? 女人梦见新娘穿着红嫁衣躺自己身上? 百科上说文言文中的意动用法只能用于形容词和名词,是这样吗。是不是有特例啊? 在古汉语的使动用法和意动用法的区别 文言文中的宾语前置,定语后置,介宾短语后置,意动用法 意动和使动 梦见和新娘说话是什么意思? 使动用法和意动用法有什么区别? 梦见和别人的新娘睡觉 什么是意动用法 古代汉语使动用法和意动用法的区别 梦见新娘新浪躺在床上 梦见新郎新娘在简陋的新房里睡觉? 简述人力资源管理者应具备的能力 人力资源工作者应具备哪些能力和素质 人力资源管理者需要具备哪些能力 如何在砖墙上打洞装油烟机 人力资源管理人员需要那些能力 人力资源管理,需要哪些方面的知识和技能 厨房的墙上打孔钉安装抽烟机,会不会打到里面的电线而发现不了? 更换油烟机,孔距不同,只能重新在墙上打孔吗? 如何有效提高人力资源管理的能力 后墙凿抽烟机对邻居好吗 俄罗斯产金属钠纯度99.95现在国内卖多少钱 抽油烟机是在墙上打孔好还是从玻璃上打孔好 油烟机排风不走烟道,直接墙壁打孔排烟,管道问题,急急急急急、 俄罗斯进口的金属钠纯度99.96每公斤价格多少? 装修厨房的时候,是先打抽油烟机的孔,还是先贴好瓷砖再打孔,为什么? 油烟机排风打孔,墙体厚60公分,可以打孔吗 油烟机排风管通在墙外是先打孔还是贴完瓷砖再打打? 我买了个水钻打孔机,用于平常专门给别人打空调孔,抽油烟机孔等,但是钻头尺寸我要买哪几种合适? 瓷砖如何打孔安装油烟机 请问金属钾和金属钠的价格为多少
  • 焦点

最新推荐

猜你喜欢

热门推荐