Heim > Datenbank > MySQL-Tutorial > mysql导入存储过程时declare报错的有关问题解决

mysql导入存储过程时declare报错的有关问题解决

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-07 16:15:19
Original
2933 Leute haben es durchsucht

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 ne

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

?

现在明白了吧。。。

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
So ändern Sie MySQL in MySQL
Aus 1970-01-01 08:00:00
0
0
0
MySQL-Startfehler unter Centos
Aus 1970-01-01 08:00:00
0
0
0
MySQL stoppt den Prozess
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage