標籤:
我用記事本寫了一個簡單的預存程序如下:
delimiter$$
create procedure show_users()
comment ‘查看market資料庫中的user表中的所有資訊‘
begin
select * from user;
END$$
delimiter;
儲存為show_users.sql
執行(show_users.sql在工作目錄,如果不在請加上絕對路徑):
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)儲過程的許可權,同上,用管理員賬戶賦予):
到此終於完成了第一個預存程序的執行,我們發現這其實並不是一個容易的過程,不過我們也知道了一些其他實用的東西,相信以後就會慢慢熟悉,很快定位錯誤了。
MySQL預存程序初遇