mysql教程存儲過程創建與注意事項
第一 mysql存儲過程跟之前寫sqlserver 2005 的存儲過程有點區別;
第二,用的mysql第三方企業管理器 sqlyogent.exe 調試的時候,寫存儲過程和一般的查詢語句要分開的,我是後來才意識到的,氣得要命(可能也是用sqlserver 2005企業管理器的編輯器的習慣導致的)。 廢話少說,寫存儲過程,要注意如下幾點:
第一 要定義delimiter //,意思是用//作為一段語句的結束符(這個很重要,我寫的存儲過程語法一點也沒錯,但是,就是通不過,原來分號:;分隔符是通知mysql客戶端已經輸入完成的符號,而我的存儲過程裡邊很多都有分號;結果運行的時候,就是把我一段存儲過程分成很多段執行)
第二 如果你想我一樣“不幸”選擇了第三方mysql客戶端sqlyogent.exe ,一定要在數據庫教程目錄裡邊的存儲過程右鍵選擇新建存儲過程,然後在右邊彈出的窗口裡鍵入你的存儲過程語句,在普通查詢分析器輸入無效,這是慘痛教訓
第三,如果存儲過程的參數如果是輸入中文的話,要在定義存儲過程的後面加上character set gbk這個編碼,不然調用存儲過程使用中文參數的時候會出錯,如:
create procedure countpro(out a_out int,in b_date date, in unit_name varchar(45) character set gbk)
第四,如果你的存儲過程裡邊需要模糊查詢,用到 like '%內容%' 不要在select 語句的where後邊寫'%';定義一個參數,用: set wherestr = "'%"+wherestr+"%'";拼接語句第五,最後要還原結束符:delimiter ; 為;作為語句的結束符
下面來看mysql存儲過程實例
1. 創建實例數據庫
create database db5;
use db5;2.創建一個簡單的工作表,並插入數據
create table t(s1 int);
insert into t values(5);3.創建程序實例 create procedure example
create procedure p1() select * from t;
sql語句存儲過程的第一部分是 create procedure
第二部分是過程名:上面新存儲過程的名字是p1。
第三部分書參數列表(),第四部分是程序的主體,“select * from t”*****什麼樣的mysql語句在存儲過程體中是合法的?
在存儲過程體中可以包含所有的合法sql數據庫定義語言,insert,update,delete,drop,create,replace等等語句
包括(set,commit,rollback)但是,在代碼中如果包含mysql的擴充功能,那麼代碼將不能移植。
4. 調用存儲過程,所需要輸入的就是call和你過程名以及一個括號。
call p1();5.過程中的特征子句
create procedure p2()language sql
not deterministic
sql security definer
comment ''
select current_date,rand() from t;6.parameters參數
create procedure p5()------; //參數列表是空的
create procedure p5([in] name data-type)---- //輸入參數in可選,默認為參數為in
create procedure p5(out name data-type)----- //輸出參數out
create procedure p5(inout 那麼data-type)----- //即可以做輸入參數也可以做輸出參數----輸入參數in 例子。
create procedure p5(p int) set @x=p;
call p5(12345);
select @x;----輸出參數out 例子
create procedure p6(out p int)set p=-5;
call p6(@y);
select @y;7. 復合語句:如果你的過程中有多條語句,那麼你需要begin/end塊。在這裡你可以進行變量的定義和流程的控制
首先執行命令 delimiter //
create procedure p7()
begin
set @a=6;
set @b=5;
insert into t values (@a);
select s1 * @a from t where s1>= @b;
end;//-----在復合語句中申明變量
create procedure p8()
begin
declare a int;
declare b int;
set a=5;
set b=5;
insert into t values (a);
select s1*a from t where s1>=b;
end;//含有default默認語句舌設定語句的例子
create procedure p9()
begin
declare a ,b int default 5;
insert into t values(a);
select s1*a from t where s1>=b;
end;//8. scope作用域的問題:內部的變量在其作用域范圍內享有更高的優先權,當執行到end
變量時,內部變量消失,此時已經在其作用域外,變量不再可見了,應為在存儲
過程外再也不能找到這個申明的變量,但是你可以通過out參數或者將其值指派
給會話變量來保存其值。
create procedure p11()
begin
declare x1 char(5) default 'outer';
begin
declare x1 char(5) default 'inner';
select x1;
end;
select x1;
end;//
/********************************* 存儲過程中的條件式語句 ***************************************/1. if-then -else語句
create procedure p12(in parameter int)
begin
declare var int;
set var=parameter+1;
if var=0 then
insert into t values(17);
end if;
if parameter=0 then
update t set s1=s1+1;
else
update t set s1=s1+2;
end if;
end;//2. case指令:如果需要進行更多條件真假的判斷我們可以使用case語句
create procedure p13(in parameter int)
begin
declare var int;
set var=parameter+1;
case var
when 0 then insert into t values(17);
when 1 then insert into t values(18);
else insert into t values(19);
end case;
end;///***************************** 循環語句 ************************************/
1. while ···· end while; 循環語句
create procedure p14()
begin
declare var int;
set var=0;
while var<6 do
insert into t values(var);
set var=var+1;
end while;
end;//2. repeat···· end repeat ;它在執行操作後檢查結果,而while則是執行前進行檢查
create procedure p15()
begin
declare v int;
set v=0;
repeat
insert into t values(v);
set v=v+1;
until v>=5
end repeat;
end;//3. loop ·····end loop; loop 循環不需要初始條件,這點和while 循環相似,同時和repeat
循環一樣不需要結束條件, leave語句的意義是離開循環,
create procedure p16()
begin
declare v int;
set v=0;
loop_lable:loop
insert into t values(v);
set v=v+1;
if v >=5 then
leave loop_lable;
end if;
end loop;
end;//4. lables 標號:標號可以用在begin repeat while 或者loop 語句前,語句標號只能在
合法的語句前面使用。可以跳出循環,使運行指令達到復合語句的最後一步。/***************************** iterate迭代 ***************************************/
1. iterate:通過引用復合語句的標號,來從新開始復合語句
create procedure p20()
begin
declare v int;
set v=0;
loop_lable:loop
if v=3 then
set v=v+1;
iterate loop_lable;
end if;
insert into t values(v);
set v=v+1;
if v>=5 then
leave loop_lable;
end if;
end loop;
end;//