mysql 中函數和存儲過程的區別和聯繫

怎麼查詢,怎樣寫sql

在sql 語句中判斷不能用 == ,要用 = 就行了 ,賦值 用 :=

函數 和 儲存過程的相同點 和不同點:

函數的創建:

函數只能在指定數據庫中用。 和存儲方法一樣

delimiter

createfunction函數名稱(參數列表)returns返回類型beginsql語句end

createfunction函數名稱(參數列表)returns返回類型beginsql語句end

delimiter ;

調用:

select 函數名(參數列表)

刪除函數:

drop function 函數名稱;

儲存過程的創建:

delimiter //

create procedure 存儲過程名稱(參數列表)

begin

sql語句

end

//

delimiter ;

調用時:

call 儲存過程名(); --沒有參數的話括號可以省去

刪除儲存過程:

drop procedure 存儲過程名稱;

相同點

提高了語法的執行效率

* 存儲過程和函數都是為了可重複的執行操作數據庫的 sql 語句的集合.

* 存儲過程和函數都是一次編譯,就會被緩存起來,下次使用就直接命中緩存中已經編譯好的 sql, 不需要重複編譯

* 減少網絡交互,減少網絡訪問流量

不同點

* 標識符不同,函數的標識符是 function, 過程:procedure

* 函數中有返回值,且必須有返回值,而過程沒有返回值,但是可以通過設置參數類型(in,out)來實現多個參數或者返回值

* 函數使用 select 調用,存儲過程需要使用 call 調用

* select 語句可以在存儲過中調用,但是除了 select ... into 之外的 select 語句都不能再函數中調用

* 通過 in out 參數,過程相關函數更加靈活,可以返回多個結果

* 在實際開發中根據個人喜好選擇使用函數或者存儲過程

查看

* 所有存儲過程和函數,都存儲在mysql數據庫下的proc表中

* 查看錶結構

desc mysql.proc\G;

* 主要字段說明:

*

* name表示名稱

* type表示類型,為存儲過程、函數

* body表示正文腳本

* db表示屬於的數據庫

* 查看python數據庫的所有存儲過程

select name,type,body from mysql.proc where db='python';

函數實例:

-- 輸出 0 ~ 100 間的偶數

-- 遞增某一個值

-- 判斷該值是否為偶數

-- 將偶數 拼接成一個字符串 最後返回

delimiter //

create function f3() returns varchar(300)

begin

declare i int default 0;

declare res varchar(300) default '';

-- 2. 通過 while 遞增 i

while i <= 100 do

-- 3. 判斷 i 是否是偶數

if i % 2 = 0 then

-- 4. 拼接偶數

set res = concat(res,' ',i);

end if;

-- 遞增 i

set i = i + 1;

end while;

-- 5. 返回 res

return res;

end

//

delimiter ;

儲存過程實例:

-- 傳入一個英雄的 id 刪除該英雄,並且返回剩下的英雄總人數

delimiter //

create procedure deleteherobyid_getcount(in hid int unsigned,out rescount int)

begin

delete from mm_users where id = hid;

select count(*) from mm_users into rescount;

end

//

delimiter ;

mysql 中函數和存儲過程的區別和聯繫


分享到:


相關文章: