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;//