Mysql 儲存過程1

2021-08-27 14:26:05 字數 3224 閱讀 4499

儲存過程的優勢:

1,一般的sql命令在執行前需要解析、編譯前提準備過程,但是儲存

過程是事先完成了解析,編譯處理後儲存在資料庫的,執行時能減輕

資料庫負擔,提高執行效能。

2,減輕網路負擔,之前的傳遞sql語句,變成現在的傳遞引數。

3,防止對錶的直接訪問。

4,可以減少大部分的程式**。

5,msyql5.0版本之後才支援儲存過程

寫mysql儲存過程需要注意一下幾點:

1,要定義delimiter //

2,如果儲存過程的引數如果是輸入中文的話,要在定義儲存過程的後面加上character set gbk這個編碼,

不然呼叫儲存過程使用中文引數的時候會出錯,

3,如果你的儲存過程裡邊需要模糊查詢,用到 like '%內容%' 不要在select 語句的where後邊寫'%';定義乙個引數,

用: set wherestr = "'%"+wherestr+"%'";拼接語句

4,最後要還原結束符:delimiter ; 為;作為語句的結束符

5,儲存過程**中如果包含mysql的擴充功能,那麼**將不能移植。

儲存過程知識點:

1,建立語法

create procedure 儲存過程名(

引數種類  引數名 引數型別)

begin  

處理內容

end注意:處理內容必須放在begin、end之間,如果僅有一條語句

可以省略begin end 但是強烈建議,所有的都加上begin

end塊。養成良好的習慣。

引數種類:in,out,inout 預設的是in可以不寫。

2,建立儲存過程,接收乙個收入引數,如果該引數有null或者是''

那麼查詢customer的全部記錄,如果沒有上述情況則查詢該表中

那麼欄位為引數的記錄。

create procedure sp_search_customer(in p_name varchar(20))

begin

if p_name is null or p_name = ''  

then  

select * from customer;

else 

select * from customer where name like p_name;

end if;

end注意:1,判斷乙個變數是否為空時: p_name is null

2,判斷乙個變數是否是空字串是 p_name = '' 等號是單等號

3,end if 要分開,並且要跟上分好,否則他媽的編譯不通過。

呼叫:call sp_search_customer('陳%');//注意這種方式在學習的時候

可以這樣呼叫,實際開發會出現sql注入的bug。

3,建立儲存過程實現功能:根據name的值查詢customer表,並把查詢的結果的

數返回來。

create procedure sp_search_customer(in p_name varchar(20),out p_cnt int)

begin

if p_name is null or p_name=''   then

select * from customer;

else

select * from customer where name like p_name;

end if;

select found_rows() into p_cnt;

end呼叫:call sp_search_customer('陳超陽%',@num);

select @num;

說明:1,found_rows()函式取得前一條select語句檢索出來的記錄總數。

2, select .....into 命令用於將select語句取得的結果設定到指定的

變數中(儲存過程中的變數就像是儲存資料的臨時容器,輸入輸出引數

也是變數的一種。

select into 語法:

select 列名1,.....into 變數名1,.....from 表名 where 條件

注意:這裡的select必須保證只檢索出一條資料。

3,呼叫含有輸出引數時,需要在輸出引數名稱前加上@,呼叫完該儲存過程後

直接select 輸出引數名稱   就可得到儲存過程的執行結果。

4,if 多條件分支

select * from customer;

mysql> select * from customer

| id | name   | password |

|  2 | lijuan | lijuan   |

|  3 | 陳超陽 | 陳超陽   |

|  4 | 張三   | 張三     |

|  5 | 張三   | 張三     |

|  6 | 李四   | 李四     |

5 rows in set (0.04 sec)

create procedure sp_search_customer6(in mycondition int)

begin

if mycondition > 0 then

select * from customer where name = '陳超陽';

elseif mycondition > 1    then

select * from customer where name = '張三';

elseif mycondition > 2  then

select * from customer where name = '李四';

else

select * from customer;

end if;

endcall sp_search_customer(2);

結果:mysql> call sp_search_customer6(3);

| id | name   | password |

|  3 | 陳超陽 | 陳超陽   |

1 row in set (0.00 sec)

query ok, 0 rows affected (0.01 sec)

注意點:1,在多個條件下,如果給出的條件滿足多個分支,那麼只執行最前面

的那個條件。上述儲存過程只要給出大於0的數結果總是陳超陽。

說明了那個問題。

2,elseif 是合體,不能分開。

3,end if是分體,並且需要跟上分號。

mysql儲存過程(1)

1 in引數的理解 delimiter cre atep roce dure sele ctus er1 inus erid int begi nsel ect from tuse rwhe reid us erid end create procedure selectuser1 in useri...

MySQL儲存過程 (1)

引數模式 in 該引數作為輸入,該引數呼叫傳入值 out 該引數作為輸出,該引數作為返回值 inout 該引數即可作為輸入,也可作為輸出,該引數即可呼叫傳入值,也可作為返回值 delimiter 設定結束標記,比如 delimiter 1 不帶引數儲存過程 delimiter create proc...

mysql高階 儲存過程 1

在一起的語言,叫做 過程 php中沒有過程,只有函式,準確的說.函式能起到過程的作用 過程 就是封裝語句,呼叫的時候,這些封裝體執行 函式是有返回值的過程,而過程沒有返回值的函式 過程 把若干條sql封裝起來,起個名字就是過程 儲存過程 把此過程存在資料庫中,叫做儲存過程 匿名過程 mysql 不支...