真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql存儲過程與存儲函數(shù)實例分析

這篇文章主要介紹了MySQL存儲過程與存儲函數(shù)實例分析的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇mysql存儲過程與存儲函數(shù)實例分析文章都會有所收獲,下面我們一起來看看吧。

創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括成都網(wǎng)站建設(shè)、網(wǎng)站制作、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)核心團隊十載專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。

存儲過程

  • 簡介

是一組經(jīng)過 預(yù)先編譯 的 SQL 語句的封裝
存儲過程預(yù)先存儲在 MySQL 服務(wù)器上,需要執(zhí)行的時候,客戶端只需要向服務(wù)器端發(fā)出調(diào)用存儲過程的命令,服務(wù)器端就可以把預(yù)先存儲好的這一系列 SQL 語句全部執(zhí)行
  • 分類

1、沒有參數(shù)(無參數(shù)無返回) 
2、僅僅帶 IN 類型(有參數(shù)無返回) 
3、僅僅帶 OUT 類型(無參數(shù)有返回) 
4、既帶 IN 又帶 OUT(有參數(shù)有返回) 
5、帶 INOUT(有參數(shù)有返回)
  • 格式

DELIMITER $
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數(shù)名 參數(shù)類型,...)
[characteristics ...]
BEGIN
    sql語句1;
    sql語句2;
END $

IN :當前參數(shù)為輸入?yún)?shù),也就是表示入?yún)?;存儲過程只是讀取這個參數(shù)的值。如果沒有定義參數(shù)種類, 默認就是 IN ,表示輸入?yún)?shù)
OUT :當前參數(shù)為輸出參數(shù),也就是表示出參;執(zhí)行完成之后,調(diào)用這個存儲過程的客戶端或者應(yīng)用程序就可以讀取這個參數(shù)返回的值了
INOUT :當前參數(shù)既可以為輸入?yún)?shù),也可以為輸出參數(shù)

形參類型可以是 MySQL數(shù)據(jù)庫中的任意類型

characteristics 表示創(chuàng)建存儲過程時指定的對存儲過程的約束條件

1. BEGIN…END:BEGIN…END 中間包含了多個語句,每個語句都以(;)號為結(jié)束符
2. DECLARE:DECLARE 用來聲明變量,使用的位置在于 BEGIN…END 語句中間,而且需要在其他語句使用之前進行變量的聲明
3. SET:賦值語句,用于對變量進行賦值
4. SELECT… INTO:把從數(shù)據(jù)表中查詢的結(jié)果存放到變量中,也就是為變量賦值

存儲過程體中可以有多條 SQL 語句,如果僅僅一條SQL 語句,則可以省略 BEGIN 和 END

DELIMITER 新的結(jié)束標記
DELIMITER //”語句的作用是將MySQL的結(jié)束符設(shè)置為//,并以“END //”結(jié)束存儲過程。存儲過程定義完畢之后再使用“DELIMITER ;”恢復默認結(jié)束符
當使用DELIMITER命令時,應(yīng)該避免使用反斜杠(‘\’)字符,因為反斜線是MySQL的轉(zhuǎn)義字符
  • 代碼案例

# 類型1:無參數(shù)無返回值
# 舉例1:創(chuàng)建存儲過程select_all_data(),查看 employees 表的所有數(shù)據(jù)
DELIMITER $     # 開始
CREATE PROCEDURE select_all_data()
BEGIN
  SELECT * FROM employees;
END $
DELIMITER;    # 結(jié)束
# 存儲過程的調(diào)用
CALL select_all_data();

# 舉例2:創(chuàng)建存儲過程avg_employee_salary(),返回所有員工的平均工資
DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGIN 
  SELECT AVG(salary) FROM employees;
END //
DELIMITER ;
# 調(diào)用
CALL avg_employee_salary();

# 舉例3:創(chuàng)建存儲過程show_max_salary(),用來查看“emps”表的最高薪資值
DELIMITER //
CREATE PROCEDURE show_max_salary()
BEGIN
  SELECT MAX(salary)
  FROM employees;
END //
DELIMITER ;
# 調(diào)用
CALL show_max_salary();

# 類型2:帶 OUT
# 舉例4:創(chuàng)建存儲過程show_min_salary(),查看“emps”表的最低薪資值。并將最低薪資通過OUT參數(shù)“ms”輸出
DELIMITER //
CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)   # 輸出ms,類型是DOUBLE
BEGIN
  SELECT MIN(salary) INTO ms    # 將min賦值給ms
  FROM employees;
END //
DELIMITER 
# 調(diào)用
CALL show_min_salary(@ms);
# 查看變量值
SELECT @ms;

# 類型3:帶 IN
# 舉例5:創(chuàng)建存儲過程show_someone_salary(),查看“emps”表的某個員工的薪資,并用IN參數(shù)empname輸入員工姓名
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))   # 傳入empname,類型為VARCHAR
BEGIN
  SELECT salary FROM employees
  WHERE last_name = empname;   # 使用empname
END //
DELIMITER;
# 調(diào)用方式1
CALL show_someone_salary('Abel');
# 調(diào)用方式2
SET @empname := 'Abel';
CALL show_someone_salary(@empname);

# 類型4:帶 IN 和 OUT
# 舉例6:創(chuàng)建存儲過程show_someone_salary2(),查看“emps”表的某個員工的薪資,并用IN參數(shù)empname輸入員工姓名,用OUT參數(shù)empsalary輸出員工薪資
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20), OUT empsalary DECIMAL(10,2))
BEGIN
  SELECT salary INTO empsalary   # 賦值
  FROM employees
  WHERE last_name = empname;   # 使用參數(shù)
END //
DELIMITER;
# 調(diào)用
SET @empname = 'Abel';
CALL show_someone_salary2(@empname, @empsalary);
# 查看
SELECT @empname
SELECT @empsalary;

# 類型5:帶 INOUT
# 舉例7:創(chuàng)建存儲過程show_mgr_name(),查詢某個員工領(lǐng)導的姓名,并用INOUT參數(shù)“empname”輸入員工姓名,輸出領(lǐng)導的姓名
DELIMITER $
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGIN
  SELECT last_name INTO empname
  FROM employees
  WHERE employee_id = (
        SELECT manager_id
        FROM employees
        WHERE last_name = empname
        );
END $
DELIMITER ;
#調(diào)用
SET @empname := 'Abel';
CALL show_mgr_name(@empname);
# 查看
SELECT @empname;

存儲函數(shù)

  • 格式

CREATE FUNCTION 函數(shù)名(參數(shù)名 參數(shù)類型,...)
RETURNS 返回值類型
[characteristics ...]
BEGIN
函數(shù)體 #函數(shù)體中肯定有 RETURN 語句
END

1、RETURNS type 語句表示函數(shù)返回數(shù)據(jù)的類型
2、RETURNS子句只能對FUNCTION做指定,對函數(shù)而言這是 強制 的。它用來指定函數(shù)的返回類型,而且函數(shù)體必須包含一個 RETURN value 語句
3、characteristic 創(chuàng)建函數(shù)時指定的對函數(shù)的約束。取值與創(chuàng)建存儲過程時相同
4、函數(shù)體也可以用BEGIN…END來表示SQL代碼的開始和結(jié)束。如果函數(shù)體只有一條語句,也可以省略BEGIN…END
5、調(diào)用存儲函數(shù)
      SELECT 函數(shù)名(實參列表)
  • characteristics

LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string

1、LANGUAGE SQL :說明存儲過程執(zhí)行體是由SQL語句組成的,當前系統(tǒng)支持的語言為SQL
2、[NOT] DETERMINISTIC :指明存儲過程執(zhí)行的結(jié)果是否確定。DETERMINISTIC表示結(jié)果是確定的。每次執(zhí)行存儲過程時,相同的輸入會得到相同的輸出。NOT DETERMINISTIC表示結(jié)果是不確定
的,相同的輸入可能得到不同的輸出。如果沒有指定任意一個值,默認為NOT DETERMINISTIC
3、{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用SQL語句的限制
      CONTAINS SQL表示當前存儲過程的子程序包含SQL語句,但是并不包含讀寫數(shù)據(jù)的SQL語句
      NO SQL表示當前存儲過程的子程序中不包含任何SQL語句
      READS SQL DATA表示當前存儲過程的子程序中包含讀數(shù)據(jù)的SQL語句
      MODIFIES SQL DATA表示當前存儲過程的子程序中包含寫數(shù)據(jù)的SQL語句
      默認情況下,系統(tǒng)會指定為CONTAINS SQL
4、SQL SECURITY { DEFINER | INVOKER } :執(zhí)行當前存儲過程的權(quán)限,即指明哪些用戶能夠執(zhí)行當前存儲過程
      DEFINER 表示只有當前存儲過程的創(chuàng)建者或者定義者才能執(zhí)行當前存儲過程;
      INVOKER 表示擁有當前存儲過程的訪問權(quán)限的用戶能夠執(zhí)行當前存儲過程。
      如果沒有設(shè)置相關(guān)的值,則MySQL默認指定值為DEFINER
5、COMMENT 'string' :注釋信息,可以用來描述存儲過程
  • 代碼案例

# 舉例1:創(chuàng)建存儲函數(shù),名稱為email_by_name(),參數(shù)定義為空,該函數(shù)查詢Abel的email,并返回,數(shù)據(jù)類型為字符串型
DELIMITER //    # 開始
CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)   # 返回值
  DETERMINISTIC   # 表示結(jié)果確定
  CONTAINS SQL    # 表示包含sql語句
  READS SQL DATA    # 表示包含讀數(shù)據(jù)的sql
BEGIN
  RETURN (SELECT email FROM employees WHERE last_name = 'Abel');
END //
DELIMITER;    # 結(jié)束
# 調(diào)用
SELECT email_by_name();

# 舉例2:創(chuàng)建存儲函數(shù),名稱為email_by_id(),參數(shù)傳入emp_id,該函數(shù)查詢emp_id的email,并返回,數(shù)據(jù)類型為字符串型
# 創(chuàng)建函數(shù)前執(zhí)行此語句,保證函數(shù)的創(chuàng)建會成功;則不需要寫characteristics
SET GLOBAL log_bin_trust_function_creators = 1;
# 聲明函數(shù)
DELIMITER //    # 開始
CREATE FUNCTION email_by_id(emp_id INT)  # 傳入?yún)?shù)
RETURNS VARCHAR(25)   # 返回值
BEGIN
  RETURN (SELECT email FROM employees WHERE employee_id = emp_id);  # 使用emp_id
END //
DELIMITER;
# 調(diào)用
SELECT email_by_id(101);
# 調(diào)用方式2
SET @emp_id := 102;
SELECT email_by_id(@emp_id);

# 舉例3:創(chuàng)建存儲函數(shù)count_by_id(),參數(shù)傳入dept_id,該函數(shù)查詢dept_id部門的員工人數(shù),并返回,數(shù)據(jù)類型為整型。
DELIMITER //
CREATE FUNCTION count_by_id(dept_id INT)
RETURNS INT
BEGIN
  RETURN (SELECT COUNT(*) FROM employees WHERE department_id = dept_id);
END //
DELIMITER ;
# 調(diào)用
SET @dept_id := 50;
SELECT count_by_id(@dept_id);
  • 存儲過程、存儲函數(shù)的查看

# 方式1:使用SHOW CREATE語句查看存儲過程和函數(shù)的創(chuàng)建信息
# 查看存儲過程
SHOW CREATE PROCEDURE show_mgr_name;
# 查看存儲函數(shù)
SHOW CREATE FUNCTION count_by_id;

# 方式2:使用SHOW STATUS語句查看存儲過程和函數(shù)的狀態(tài)信息
# 查看存儲過程
SHOW PROCEDURE STATUS;
# 查看指定存儲過程
SHOW PROCEDURE STATUS LIKE 'show_max_salary';
# 查看指定存儲函數(shù)
SHOW FUNCTION STATUS LIKE 'email_by_id';

# 方式3:從information_schema.Routines表中查看存儲過程和函數(shù)的信息

SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='email_by_id' AND ROUTINE_TYPE = 'FUNCTION';

SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='show_min_salary' AND ROUTINE_TYPE = 'PROCEDURE';
  • 存儲過程、函數(shù)的修改

ALTER PROCEDURE show_max_salary
SQL SECURITY INVOKER
COMMENT '查詢最高工資';
  • 存儲過程、函數(shù)的刪除

DROP FUNCTION IF EXISTS count_by_id;

DROP PROCEDURE IF EXISTS show_min_salary;

關(guān)于“mysql存儲過程與存儲函數(shù)實例分析”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“mysql存儲過程與存儲函數(shù)實例分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁標題:mysql存儲過程與存儲函數(shù)實例分析
網(wǎng)站路徑:http://weahome.cn/article/jsshei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部