我用記事本寫了一個簡單的存儲過程以下:mysql
delimiter$$sql
create procedure show_users()數據庫
comment '查看market數據庫中的user表中的全部信息'工具
begin編碼
select * from user;spa
END$$server
delimiter;utf-8
保存爲show_users.sqlit
執行(show_users.sql在工做目錄,若是不在請加上絕對路徑):io
mysql> source show_users.sql
發生錯誤信息爲:
ERROR 1064 (42000): 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 'delim
iter$$create procedure show_users()
comment '?鿴market???ݿ??е?user??????' at line 1
ERROR 1064 (42000): 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 'END$$
delimiter' at line 1
首先是看到了有亂碼,咱們能夠先來看一下數據庫的編碼信息:
mysql> show variables like 'char%';
發現是mysql數據能夠的除了文件系統的編碼是binary其餘的編碼都是utf8(MySQL中把utf-8的別名設置爲utf8)
咱們是用記事本編寫存儲過程並導入執行的,記事本的默認的編碼是ANSI,因此咱們改變一下咱們存儲過程文件show_users.sql的編碼方式。能夠選擇記事本文件菜單下的另存爲,編碼選擇utf-8就能夠了。
咱們再來看一看錯誤信息:
ERROR 1064 (42000): 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 'END$$
delimiter' at line 1
咱們獲得的信息提示是語法錯誤,在END$$附近。咱們暫時還不清楚1064究竟是什麼錯誤,咱們用MySQL提供的工具perror來看一看錯誤代碼1064表明什麼。
C:\Users\Administrator>perror 1064(請保證mysql的bin目錄在系統環境變量中,若是沒有請加上絕對路徑)
第一個是MySQL1064的錯誤代碼信息,第二個是Windows的1064錯誤代碼信息。
ER_PARSE_ERROR解析錯誤,說明咱們犯了什麼基本的語法錯誤,可是END$$好像並無錯誤。整個存儲過程也很簡單,咱們能夠簡單分析一下,其餘地方都是SQL語句,應該沒有沒有錯誤。報錯的的地方是END$$,咱們能夠猜想要麼是這個地方出錯了,要麼是開始的delimiter$$出錯了,END$$咱們可不出什麼錯誤,因此咱們從delimiter$$開始分析一下。
delimiter是MySQL的一個關鍵字,是用來修改SQL語句的結束符的,這句話的意思是把SQL語句的結束符修改成$$爲了避免和存儲過程的結束符衝突。
嘗試了不少次才發現,既然delimiter是一個關鍵字,那麼delimiter和$$之間是否是應該有一個空格分開呢?嘗試在delimiter和$$之間加上空格分隔,發現問題確實是delimiter和$$之間少了一個空格。後來想想也對,delimiter是一個關鍵字,若是和$直接沒有空格分開,MySQL應該就會就會把它解析爲delimiter$$標識符。
上一個問題算是解決了,咱們來從新執行:
mysql> source show_users.sql
ERROR 1044 (42000): Access denied for user 'tim'@'%' to database 'market'
這個錯誤信息,很容易知道,用戶tim沒有權限,用管理員用戶爲tim用戶賦予建立存儲過程的權限。
mysql> grant create routine on market.* to tim;
flush privileges;(刷新系統權限表,有時候,須要從新登陸)
再次從新執行:
此次咱們發現沒有任何問題了,咱們來查看一下:
調用存儲過程(須要執行存(execute)儲過程的權限,同上,用管理員帳戶賦予):
到此終於完成了第一個存儲過程的執行,咱們發現這其實並非一個容易的過程,不過咱們也知道了一些其餘實用的東西,相信之後就會慢慢熟悉,很快定位錯誤了。