儲存過程
一般在大型的資料庫系統中,一組為了完成特定功能的sql語句集,儲存在資料庫中,經過第一次編譯後,再次呼叫不需要再次編譯,使用者只需要指定儲存過程名字並給定引數就可以執行完成任務。
mysql 儲存過程是從 mysql 5.0 開始增加的新功能。儲存過程的優點有一籮筐。不過最主要的還是執行效率和sql **封裝。特別是 sql **封裝功能,如果沒有儲存過程,在外部程式訪問資料庫時(例如 php),要組織很多 sql 語句。特別是業務邏輯複雜的時候,一大堆的 sql 和條件夾雜在 php **中,讓人不寒而慄。現在有了 mysql 儲存過程,業務邏輯可以封裝儲存過程中,這樣不僅容易維護,而且執行效率也高。
建立:
create procedure 儲存過程名( [in|out|inout] 引數 datatype )
begin
sql語句;
sql語句;
...end
注:儲存過程只是先編譯sql語句,所以當sql語句中有錯誤的表或屬性時,系統不會提示,而且儲存過程會建立成功。只有當呼叫執行時才提示錯誤。
( 設定mysql控制台的結尾符號: 預設的以";"結尾,我們可以自己設定結束符號,語法是: delimiter // -----》表示以"//"作為結束符號 )
create procedure tat(n1 int, n2 int)
begin
declare n3 int;
set n3 = n1 + n2;
select n3 as sum;
endcreate procedure ttb(in n int)
begin
if n is null then
set n = 1202;
end if;
select * from t_student where sid=n ;
end#
呼叫儲存過程:
call 儲存過程名( );
刪除儲存過程:
drop procedure (if exists) 儲存過程名;
帶引數的儲存過程
引數分3類:
in:表示儲存過程需要給它乙個值 (預設)
out:表示儲存過程會返回乙個值
inout:既可以傳值進去也可以帶值出來
例:建立乙個可以傳值到儲存過程內的儲存過程
delimiter //
create procedure pr_st ( in a int)
begin
select * from t_student where sid = a;
end//
delimiter;
呼叫:call pr_st(1210)
例:建立乙個可以返回值出來的儲存過程
delimiter //
create procedure pr_st ( out a int)
begin
select max(sscore) into a from t_student ;
end//
delimiter;
呼叫:call pr_st( @a );
select @a;
例:建立乙個可以返回和傳入值的儲存過程
delimiter //
create procedure pr_st ( in a int, out b int)
begin
select sage into b from t_student where sid = a;
end//
delimiter;
呼叫:call pr_st( 1210,@a );
select @a;
注:limit 後面不允許有引數,所以儲存過程裡面的limit後面不能用引數
例:建立乙個可以返回和傳入值的儲存過程(同乙個引數)
delimiter //
create procedure pr_st ( inout a int)
begin
select sage from t_student where sid = a into a;
end//
delimiter;
呼叫:set @b = 1210;
call pr_st(@b);
select @b;
delimiter //
create procedure pr_st ( in a int,in b varchar(10))
begin
insert into t_dept(did,dname) values(a,b);
end//
delimiter;
call(1111,'abc');
mysql 儲存過程特點
建立 mysql 儲存過程的簡單語法為:
create procedure 儲存過程名字()
([in|out|inout] 引數 datatype
)begin
mysql 語句;
end;
mysql 儲存過程引數如果不顯式指定"in"、"out"、"inout",則預設為"in"。習慣上,對於是"in" 的引數,我們都不會顯式指定。
1. mysql 儲存過程名字後面的"()"是必須的,即使沒有乙個引數,也需要"()"
2. mysql 儲存過程引數,不能在引數名稱前加"@",如:"@a int"。下面的建立儲存過程語法在 mysql 中是錯誤的(在 sql server 中是正確的)。 mysql 儲存過程中的變數,不需要在變數名字前加"@",雖然 mysql 客戶端使用者變數要加個"@"。
create procedure pr_add
(@a int,- 錯誤
b int - 正確
)3. mysql 儲存過程的引數不能指定預設值。
4. mysql 儲存過程不需要在 procedure body 前面加 "as"。而 sql server 儲存過程必須加 "as" 關鍵字。
create procedure pr_add
(a int,
b int
)as - 錯誤,mysql 不需要 "as"
begin
mysql statement ...;
end;
5. 如果 mysql 儲存過程中包含多條 mysql 語句,則需要 begin end 關鍵字。
create procedure pr_add
(a int,
b int
)begin
mysql statement 1 ...;
mysql statement 2 ...;
end;
6. mysql 儲存過程中的每條語句的末尾,都要加上分號 ";"
...declare c int;
if a is null then
set a = 0;
end if;
...end;
7. mysql 儲存過程中的注釋。
/*這是個
多行 mysql 注釋。
/declare c int; - 這是單行 mysql 注釋 (注意- 後至少要有乙個空格)
if a is null then 這也是個單行 mysql 注釋
set a = 0;
end if;
...end;
8. 不能在 mysql 儲存過程中使用 "return" 關鍵字。
set c = a + b;
select c as sum;
/*return c;- 不能在 mysql 儲存過程中使用。return 只能出現在函式中。
/end;
9. 呼叫 mysql 儲存過程時候,需要在過程名字後面加"()",即使沒有乙個引數,也需要"()"
call pr_no_param();
10. 因為 mysql 儲存過程引數沒有預設值,所以在呼叫 mysql 儲存過程時候,不能省略引數。可以用 null 來替代。
call pr_add(10, null);
展示資料庫有哪些儲存過程:
select name from mysql.proc where db='資料庫名'
show procedure status where db='資料庫名'
mysql儲存過程 MySQL儲存過程
在本節中,您將逐步學習如何在mysql中編寫和開發儲存過程。首先,我們向您介紹儲存過程的概念,並討論何時使用它。然後,展示如何使用過程 的基本元素,如建立儲存過程的語句,if else,case,loop,儲存過程的引數。下面每個教程都包含了易於理解的示例和詳細的說明。如果您瀏覽並學習所有教程,您可...
mysql 儲存過程 mysql 儲存過程
建立 為建立儲存過程的結束標誌,使用delimiter 可更改標誌 格式create procedure begin sqlend create procedure myprocedure in param integer begin select from tb role where tb rol...
mysql 儲存過程 MySQL儲存過程
目錄 儲存過程 簡介是一組為了完成特定功能的sql語句集合 比傳統sql速度更快 執行效率更高 儲存過程的優點 執行一次後,會將生成的二進位制 駐留緩衝區,提高執行效率 sql語句加上控制語句的集合,靈活性高 在伺服器端儲存,客戶端呼叫時,降低網路負載 可多次重複被呼叫,可隨時修改,不影響客戶端呼叫...