MySQL存儲過程初遇

我用記事本寫了一個簡單的存儲過程以下: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其餘的編碼都是utf8MySQL中把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)儲過程的權限,同上,用管理員帳戶賦予):

       到此終於完成了第一個存儲過程的執行,咱們發現這其實並非一個容易的過程,不過咱們也知道了一些其餘實用的東西,相信之後就會慢慢熟悉,很快定位錯誤了。

相關文章
相關標籤/搜索