日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2025/3/19 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql命令导入存储过程报错_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命令导入存储过程报错_mysql导入存储过程时declare报错的有关问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。