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报错的有关问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql timestamp 差值_M
- 下一篇: python获取方法的装饰方法_pyth