《Mysql應用MySQL存儲過程筆記》要點:
本文介紹了Mysql應用MySQL存儲過程筆記,希望對您有用。如果有疑問,可以聯系我們。
導讀:1,創建實例數據庫
create database db5; use db5;2,創建一個簡單的工作表,并插入數據
create table t(s1 int); insert into t v...
1,創建實例數據庫
??MYSQL教程
create database db5;
?? use db5;
?
2,創建一個簡單的工作表,并插入數據
??MYSQL教程
create table t(s1 int);
?? insert into t values(5);
?
3,創建程序實例
?MYSQL教程
?? 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,過程中的特征子句
??MYSQL教程
? create procedure p2()
??? language SQL
???? NOT DETERMINISTIC
??? SQL SECURITY DEFINER
??? COMMENT ''
???? select current_date,rand() from t;
?
反映存儲過程特性的子句.子句內容在括號之后,主體之前.這些子句都是可選的,他們有什么作用呢
LANGUAGE SQL子句是沒有作用的.僅僅是為了說明下面過程的主體使用SQL語言編寫.這條是系統默認的,但你在這里聲明是有用的,因為某些DBMS(IBM的DB2)需要它,如果你關注DB2的兼容問題最好還是用上.此外,今后可能會出現除SQL外的其他語言支持的存儲過程
NOT DETERMINISTIC,是傳遞給系統的信息.這里一個確定過程的定義就是那些每次輸入一樣輸出也一樣的程序
SQL SECURITY,可以定義為SQL SECURITY DEFINER或SQL SECURITY
INVOKER. 這就進入了權限控制的領域了,SQL SECURITY DEFINER意味著在調用時檢查創建過程用戶的權限(另一個選項是SQL SECURITY INVOKER). 在而言,使用SQL SECURITY DEFINER指令告訴MySQL服務器檢查創建過程的用戶就可 以了,當過程已經被調用,就不檢查執行調用過程的用戶了.而另一個選項(INVOKER)
則是告訴服務器在這一步仍然要檢查調用者的權限.MYSQL教程
6,Parameters參數
??MYSQL教程
? 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塊.在這里你可以進行變量的定義和流程的控制
?????? 首先執行命令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;//
?? -----在復合語句中申明變量
?????? 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參數或者將其值指派給會話變量來保存其值.
??MYSQL教程
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語句
??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;//
?
/*********? 循環語句? ***********/
1. while ···· end while; 循環語句
?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應用MySQL存儲過程筆記》討論,分享您的想法,維易PHP學院為您提供專業教程。
轉載請注明本頁網址:
http://www.fzlkiss.com/jiaocheng/12062.html