《Mysql應(yīng)用MySQL存儲(chǔ)過程筆記》要點(diǎn):
本文介紹了Mysql應(yīng)用MySQL存儲(chǔ)過程筆記,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
導(dǎo)讀:1,創(chuàng)建實(shí)例數(shù)據(jù)庫(kù)
create database db5; use db5;2,創(chuàng)建一個(gè)簡(jiǎn)單的工作表,并插入數(shù)據(jù)
create table t(s1 int); insert into t v...
1,創(chuàng)建實(shí)例數(shù)據(jù)庫(kù)
??MYSQL教程
create database db5;
?? use db5;
?
2,創(chuàng)建一個(gè)簡(jiǎn)單的工作表,并插入數(shù)據(jù)
??MYSQL教程
create table t(s1 int);
?? insert into t values(5);
?
3,創(chuàng)建程序?qū)嵗?br>?MYSQL教程
?? create procedure p1() select * from t;
????? SQL語(yǔ)句存儲(chǔ)過程的第一部分是 create procedure
????? 第二部分是過程名:上面新存儲(chǔ)過程的名字是p1.
????? 第三部分書參數(shù)列表(),第四部分是程序的主體,“select * from t”
*****什么樣的MySQL語(yǔ)句在存儲(chǔ)過程體中是合法的?
?????? 在存儲(chǔ)過程體中可以包含所有的合法SQL數(shù)據(jù)庫(kù)定義語(yǔ)言,insert,update,delete,drop,create,replace等等語(yǔ)句
包括(set,commit,rollback)但是,在代碼中如果包含MYSQL的擴(kuò)充功能,那么代碼將不能移植.
???
4,調(diào)用存儲(chǔ)過程,所需要輸入的就是call和你過程名以及一個(gè)括號(hào).
??? call p1();
5,過程中的特征子句
??MYSQL教程
? create procedure p2()
??? language SQL
???? NOT DETERMINISTIC
??? SQL SECURITY DEFINER
??? COMMENT ''
???? select current_date,rand() from t;
?
反映存儲(chǔ)過程特性的子句.子句內(nèi)容在括號(hào)之后,主體之前.這些子句都是可選的,他們有什么作用呢
LANGUAGE SQL子句是沒有作用的.僅僅是為了說明下面過程的主體使用SQL語(yǔ)言編寫.這條是系統(tǒng)默認(rèn)的,但你在這里聲明是有用的,因?yàn)槟承〥BMS(IBM的DB2)需要它,如果你關(guān)注DB2的兼容問題最好還是用上.此外,今后可能會(huì)出現(xiàn)除SQL外的其他語(yǔ)言支持的存儲(chǔ)過程
NOT DETERMINISTIC,是傳遞給系統(tǒng)的信息.這里一個(gè)確定過程的定義就是那些每次輸入一樣輸出也一樣的程序
SQL SECURITY,可以定義為SQL SECURITY DEFINER或SQL SECURITY
INVOKER. 這就進(jìn)入了權(quán)限控制的領(lǐng)域了,SQL SECURITY DEFINER意味著在調(diào)用時(shí)檢查創(chuàng)建過程用戶的權(quán)限(另一個(gè)選項(xiàng)是SQL SECURITY INVOKER). 在而言,使用SQL SECURITY DEFINER指令告訴MySQL服務(wù)器檢查創(chuàng)建過程的用戶就可 以了,當(dāng)過程已經(jīng)被調(diào)用,就不檢查執(zhí)行調(diào)用過程的用戶了.而另一個(gè)選項(xiàng)(INVOKER)
則是告訴服務(wù)器在這一步仍然要檢查調(diào)用者的權(quán)限.MYSQL教程
6,Parameters參數(shù)
??MYSQL教程
? create procedure p5()------; //參數(shù)列表是空的
??? create procedure p5([IN] name data-type)---- //輸入?yún)?shù)in可選,默認(rèn)為參數(shù)為in
??? create procedure p5(out name data-type)----- //輸出參數(shù)out
??? create procedure p5(inout 那么data-type)----- //即可以做輸入?yún)?shù)也可以做輸出參數(shù)
?? ----輸入?yún)?shù)in 例子.
?????? create procedure p5(p int) set @x=p;
?????? call p5(12345);
?????? select @x;
?? ----輸出參數(shù)out 例子
?????? create procedure p6(out p int)set p=-5;
?????? call p6(@y);
?????? select @y;
?
7,復(fù)合語(yǔ)句:如果你的過程中有多條語(yǔ)句,那么你需要begin/end塊.在這里你可以進(jìn)行變量的定義和流程的控制
?????? 首先執(zhí)行命令MYSQL教程
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;//
?? -----在復(fù)合語(yǔ)句中申明變量
?????? 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默認(rèn)語(yǔ)句舌設(shè)定語(yǔ)句的例子
?????? 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作用域的問題:內(nèi)部的變量在其作用域范圍內(nèi)享有更高的優(yōu)先權(quán),當(dāng)執(zhí)行到end變量時(shí),內(nèi)部變量消失,此時(shí)已經(jīng)在其作用域外,變量不再可見了,應(yīng)為在存儲(chǔ)
?過程外再也不能找到這個(gè)申明的變量,但是你可以通過out參數(shù)或者將其值指派給會(huì)話變量來保存其值.
??MYSQL教程
create procedure p11()
?? begin
????? declare x1 char(5) default 'outer';
????? begin
??????? declare x1 char(5) default 'inner';
?select x1;
????? end;
????? select x1;
?? end;//
??
/*******? 存儲(chǔ)過程中的條件式語(yǔ)句? ***********/
1. if-then -else語(yǔ)句
??? 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指令:如果需要進(jìn)行更多條件真假的判斷我們可以使用case語(yǔ)句
??MYSQL教程
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;//
?
/*********? 循環(huán)語(yǔ)句? ***********/
1. while ···· end while; 循環(huán)語(yǔ)句
?MYSQL教程
? 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;//
?
歡迎參與《Mysql應(yīng)用MySQL存儲(chǔ)過程筆記》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/12062.html