mysql學習筆記(五):存儲過程

注意:此頁面是使用 SQLyog 工具操作數據庫。 

此頁面操作的 數據表 是上一張 多表查詢 創建的表。

 

什麼是存儲過程?

存儲過程是帶有 邏輯的 sql 語句,普通的 sql 語句沒有條件判斷,沒有循環,存儲過程可以帶上流程控制語句(if while)

 

存儲過程特點

1)、執行效率非常快;存儲過程是在數據庫的服務器端執行的;

2)、移植性很差;不同的數據庫,存儲過程的語法不一樣;

 

存儲過程語法

創建存儲過程:

 

執行(調用)存儲過程:

刪除 存儲過程:

 

存儲過程還可以帶有參數:

1、in:表示輸入參數,可以向存儲過程傳遞參數;

傳入一個員工的 id,根據 id 查詢員工的信息:

調用 存儲過程,傳入參數 id:

 

 

2、out:表示輸出參數,可以從存儲過程中返回結果;

那麼如何接收 存儲過程 返回的參數呢?

這裏需要用到一個新的知識點:mysql 的變量;

 

mysql 的變量共有三種:

1)、全局變量(也叫內置變量):是 mysql 內部定義好的一些變量,所有連接都起作用;

查看所有的全局變量:show variables;

查看跟字符集有關的全局變量:show variables like"character_%";

查看某一個具體的全局變量:select @@變量名,比如 select @@character_set_client;

 

其中有一個 character_set_client 表示服務器接收數據的編碼,現在編碼爲 utf8;

然後再查看命令行的編碼格式爲:GBK

由於命令行的 編碼格式 和 mysql 接收的編碼格式不一致,所以在 mysql 命令行插入 中文數據 就會報錯:

解決辦法有兩個,要麼把 mysql 數據庫接收的編碼格式改爲 gbk,要麼把命令行 的編碼格式改爲 utf8;

(a)、修改 mysql 數據庫的編碼格式爲 gbk 方法如下:

但是在查詢數據的時候又出現亂碼了:

 

是因爲 character_set_results 的值爲 utf8,表示 mysql 輸出數據的編碼爲 utf8,而前面我們查過了 命令行的編碼爲 gbk;

解決辦法:修改 character_set_results 的值爲 gbk,如下所示:

(b)、修改 命令行的編碼格式,注意,不能在 mysql 命令行中修改,要退出 mysql,在 命令提示符 界面修改,輸入 chcp 65001,表示修改命令行的編碼爲 utf-8:(chcp 936 是重新改回 GBK 編碼)

然後在 mysql 命令行中 就可以顯示中文了(注意:set 修改的編碼是臨時的,mysql 退出重啓,就會恢復):

 

但是在插入 中文數據 的時候又出現一個新的問題,如下所示: 在 sql 語句結束的時候,下一行會變成 ">,如果是用單引號就會變成 '>;在網上查了下,都說是因爲只寫了 左半邊的引號,需要補充 右半邊的引號,但是我明明 左右半邊的引號都寫了;而且我的引號是 英文引號,不是中文引號;

如果我在下一行多補充一個 右半邊的引號,報錯是沒有了,但是中文數據會變爲空值,如下所示:

只有在插入 中文數據 的時候纔會這樣,插入英文數據沒有問題;而且只有在 命令行編碼改爲 utf-8 之後插入 中文數據 纔會這樣,如果命令行編碼爲 GBK,插入中文數據也沒有問題。 

目前沒有查到解決辦法,如果有人看到,知道解決辦法的煩請告知一下,萬分感謝!!!

注意:使用 工具(SQLyog、Navicat 等)操作數據庫就不用擔心 編碼和亂碼的問題,工具會自動處理!!!

 

2)、會話變量:只存在於當前 客戶端與數據庫服務端的一次連接當中,如果連接斷開,會話變量會自動銷燬;

定義會話變量:set @變量名=變量值;

查看會話變量:select @變量名;

3)、局部變量:在存儲過程中使用的變量叫做局部變量;存儲過程執行完畢,則局部變量自動銷燬;

查看局部變量方法:select 變量名;

 

回到上面 存儲過程 返回一個輸出參數,可以定義一個 變量來接收;不能定義局部變量接收,因爲局部變量是在 存儲過程中使用的,存儲過程執行結束,變量銷燬;所以可以定義一個 會話變量來接收,如下所示:

然後查看 會話變量 的值:

 

3、inout:表示輸入輸出參數,既可以輸入數據,也可以輸出數據;

定義一個會話變量 num,然後給 num 賦值 20,如下:

 

調用 存儲過程,並傳入 num:調用存儲過程時,會執行存儲過程中的 select num 語句,輸出 num 的值爲 20;

同時在存儲過程中 重新給 num 賦值 200,並作爲參數 傳出 存儲過程;

查看從 存儲過程 中傳出的 num 變量的值:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章