MySQL預存程序初遇

來源:互聯網
上載者:User

標籤:

我用記事本寫了一個簡單的預存程序如下:

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預存程序初遇

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.