目錄
1.0  建立預存程序和函數
1. 建立預存程序
在MySQL 中,可以定義並使用變量,這些變數的作用範圍在BEGIN ... END 程式段中
定義條件和處理程序是事先定義程序執行過程中可能遇到的問題,並且可以在處理程序中定義解決這些問題的能力
4|0光标
1. 声明光标
2. 打开光标
3. 使用光标
4. 关闭光标
5|0流程控制
1. IF 语句
2. CASE 语句
3. LOOP 语句
4. LEAVE 语句
5. ITERATE 语句
6. REPEAT 语句
7. WHILE 语句
6|0操作存储过程和函数
1. 调用存储过程
2. 调用存储函数
3. 使用 SHOW STATUS 语句查看存储过程和函数的状态
4. 使用 SHOW CREATE 语句查看存储过程和函数的定义
5. 从 information_schema.Routine 表中查看存储过程和函数的信息
6. 修改存储过程和函数
7. 删除存储过程和函数
首頁 資料庫 mysql教程 MySQL預存程序和函數怎麼創建

MySQL預存程序和函數怎麼創建

Jun 03, 2023 am 09:22 AM
mysql

1.0  建立預存程序和函數

建立預存程序和函數就是將常用的一組SQL 語句組合在一起,並將這些SQL 語句當作一個整體儲存在MySQL 伺服器

1. 建立預存程序

CREATE PROCEDURE procedure_name ([proc_param[,...]])
    [characteristic ...] routine_body
登入後複製
  • procedure_name 表示所要建立的預存程序的名稱

  • ##proc_param 表示預存程序的參數

  • characteristic 表示預存程序的特性

  • routine_body 表示預存程序的SQL 語句

procedure_name 不能出現重名

proc_param 中每個參數的語法形式如下,每個參數由三個部分組成,分別為輸入/輸出類型、參數名稱和參數類型。共有三種輸入輸出類型,分別是IN、OUT、INOUT。 param_name 表示參數名,type 表示參數類型

[ IN | OUT | INOUT ] param_name type
登入後複製

characteristic 指定預存程序的特性,有以下取值:

    ##LANGUAGE SQL:說明預存程序中使用的是SQL 語言編寫的
  • [NOT] DETERMINISTIC:說明預存程序執行的結果是否正確,DETERMINISTIC 表示結果是確定的,即每次執行預存程序,相同的輸入會得到相同的輸出;NOT DETERMINISTIC 表示結果是不確定的,相同的輸入可能會得到不同的輸出,預設為NOT DETERMINISTIC
  • {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}:指明子程式使用SQL 語句的限制,CONTAINS SQL 表示子程式不包含讀取或寫入資料的語句,NO SQL 表示子程式不包含SQL,READS SQL DATA 表示子程式包含讀取資料的語句,但不包含寫資料的語句,MODIFIES SQL DATA 表示子程式包含寫資料的語句
  • SQL SECURITY {DEFINER | INVOKER}:指明誰有權限執行,DEFINER 表示只有定義者才能執行, INVOKER 表示擁有權限的呼叫者可以執行,預設為DEFINER
  • COMMENT 'string':註解訊息,可以用來描述預存程序或函數
  • 範例:建立預存程序,查詢表t_employee 中所有員工的薪水的預存程序
DELIMITER $$
CREATE PROCEDURE proc_employee()
COMMENT '查询员工薪水'
BEGIN
	SELECT salary FROM t_employee
END;
$$
DELIMITER ;
登入後複製

MySQL 中預設以分號; 作為語句結束符,預存程序中的SQL 語句需要分號來結束,為了避免衝突,先用DELIMITER $$ 將MySQL 的結束符號設為$$,再用DELIMITER ; 將結束符恢復為分號

2. 建立儲存函數

CREATE FUNCTION fun_name([func_param,[,...]])
	[characteristic ...] routine_body
登入後複製

    fun_name 表示函數名稱
  • func_param 表示函數從參數
  • characteristic 表示函數特性,取值與預存程序的取值相同
  • routine_body 表示函數的SQL 語句
  • func_param 中每個參數的語法形式如下,分別為參數名稱和參數類型

param_type type

或先前的範例
DELIMITER $$
	CREATE FUNCTION func_employee(id INT(4))
		RETURNS INT(6)
	COMMENT '查询员工薪水'
	BEGIN
		SELECT salary FROM t_employee
	END;
	$$
DELIMITER ;
登入後複製

2|0變數

在MySQL 中,可以定義並使用變量,這些變數的作用範圍在BEGIN ... END 程式段中

1.定義變數

DECLARE var_name[,...] type [DEFAULT value]
登入後複製

    關鍵字DECLARE 用來宣告變數
  • #參數var_name 是變數的名稱,可以同時定義多個變數
  • 參數type 用來指定變數的型別
  • DEFAULT value 子句將變數預設值設為value,沒有使用DEFAULT 子句時,預設值為NULL
  • 範例:定義變數sql_test,資料型別為INT 型,預設值為10
DECLARE test_sql INT DEFAULT 10;
登入後複製

2. 變數賦值

SET var_name=expr[,var_name=expr]...
登入後複製

    #關鍵字SET 用來為變數賦值
  • 參數var_name 是變數的名稱
  • 參數expr 是賦值表達式
  • #範例:將變數sql_test 賦值為30
SET test_sql = 30;
登入後複製

3|0定義條件和處理程序

定義條件和處理程序是事先定義程序執行過程中可能遇到的問題,並且可以在處理程序中定義解決這些問題的能力

1.定義條件

DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE[VALUE] sqlstate_value|mysql_error_code
登入後複製

    參數condition_name 表示條件名稱
  • #參數condition_value 表示條件型別
  • 參數sqlstate_value 和參數mysql_error_code 都可以表示MySQL 的錯誤
  • 範例:定義ERROR 1146(42S02) 錯誤,名稱為can_not_find,可以用兩種不同的方法來定義
// 方法一:使用sqlstate_value
DECLARE can_not_find CONDITION FOR SQLSTATE '42S02';
// 方法二:使用mysql_error_code
DECLARE can_not_find CONDITION FOR 1146;
登入後複製

2. 定義處理程序

DECLARE handler_type HANDLER FOR condition_value[,...] proc_statement
handler_type:
CONTINUE|EXIT|UNDO
condition_value:
SQLSTATE[VALUE]sqlstate_value|condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code
登入後複製

    handler_type 指明錯誤的處理方式:此參數有三個取值:
  • ##CONTINUE:表示遇到錯誤不處理,繼續向下執行
    • EXIT:表示遇到錯誤馬上退出
    • UNDO:表示遇到錯誤後撤回先前的操作
    • condition_value 表示錯誤類型,可以有以下取值:
  • ##SQLSTATE[VALUE]sqlstate_value 包含5 個字元的字串錯誤值
    • condition_name 表示DECLARE CONDITION 定義的錯誤條件名稱

    • SQLWARNING 匹配所有 01 开头的 SQLSTATE 错误代码

    • NOT FOUND 匹配所有 02 开头的 SQLSTATE 错误代码

    • SQLEXCEPTION 匹配所有没有被 SQLWARNING 或 NOT FOUND 捕获的 SQLSTATE 错误代码

    • mysql_error_code 匹配数值类型错误代码

  • proc_statement 匹配数值类型错误代码

下面是定义处理程序的几种示例方式:

// 方法一:捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'
SET @info='NOT FOUND';
// 方法二:使用mysql_error_code 
DECLARE CONTINUE HANDLER FOR 1146
SET @info='NOT FOUND';
// 方法三:先定义条件,然后调用
ECLARE can_not_find CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR can_not_find
SET @info='NOT FOUND';
// 方法四:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING 
SET @info='ERROR';
// 方法五:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND
SET @info='NOT FOUND';
// 方法六:使用SQLEXCEPTION 
DECLARE EXIT HANDLER FOR 使用SQLEXCEPTION
SET @info='ERROR';
登入後複製

4|0光标

在存储过程和函数中,可以使用光标逐条读取查询结果集中可能出现的多条记录。光标必须声明在处理程序之前,声明在变量和条件之后

1. 声明光标

DECLARE cursor_name CURSOR
FOR select_statement;
登入後複製
  • 参数 cursor_name 表示光标名称

  • 参数 select_statement 表示 SELECT 语句

下面声明一个名为 cur_employee 的光标

DECLARE cur_employee CURSOR
FOR SELECT name,age FROM t_employee;
登入後複製

2. 打开光标

OPEN cursor_name;
登入後複製
  • 参数 cursor_name 表示光标的名称

下面打开一个名为 cur_employee 的光标

OPEN cur_employee;
登入後複製

3. 使用光标

FETCH cursor_name
INTO var_name[,var_name...]
登入後複製
  • cursor_name 表示光标的名称

  • var_name 表示将光标中的 SELECT 语句查询出来的信息存入该参数,该参数必须在声明光标之前就定义好

下面打开一个名为 cur_employee 的光标,将查询的数据存入 emp_name 和 emp_age 这两个变量中

FETCH cur_employee INTO emp_name,emp_age;
登入後複製

4. 关闭光标

CLOSE cursor_name
登入後複製
  • cursor_name 表示光标的名称

5|0流程控制

1. IF 语句

IF search_condition THEN statement_list
 [ELSEIF search_condition THEN statement_list]...
 [ELSE statement_list]
END IF
登入後複製
  • 参数 search_condition 表示条件判断语句

  • 参数 statement_list 表示不同条件的执行语句

下面是一个 IF 语句的示例

IF age>20 THEN SET @count1=@conut1+1;
	ELSEIF age=20 THEN @count2=@conut2+1;
	ELSE @count3=@count3+1;
END IF;
登入後複製

2. CASE 语句

CASE case_value
	WHEN when_value THEN statement_list
	[WHEN when_value THEN statement_list]...
	[ELSE statement_list]
END CASE
登入後複製
  • 参数 case_value 表示条件判断的变量

  • 参数 when_value 表示变量的取值

  • 参数 statement_list 表示不同 when_value 的执行语句

下面的是一个 CASE 语句的示例

CASE age
	WHEN 20 THEN SET @count1=@count1+1;
	ELSE SET @count2=@count2+1;
END CASE;
登入後複製

3. LOOP 语句

[begin_label:]LOOP
	statement_list
END LOOP [end_label]
登入後複製
  • 参数 begin_label 和参数 end_label 分别表示循环开始和结束的标志,必须相同,而且都可以省略

  • 参数 statement_list 表示需要循环执行的语句

下面是一个 LOOP 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
END LOOP add_num
登入後複製

4. LEAVE 语句

主要用于跳出循环

LEAVE label
登入後複製
  • 参数 label 表示循环的标志

下面是一个 LEAVE 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
	IF @count1=100 THEN
		LEAVE add_num;
END LOOP add_num
登入後複製

5. ITERATE 语句

也是用于跳出循环,不过是跳出本次循环,直接进入下次循环,类似 Java 的 continue

ITERATE label
登入後複製

ITERATE label

  • 参数 label 表示循环的标志

下面是一个 ITERATE 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
	IF @count1=100 THEN
		LEAVE add_num;
	ELSE IF MOD(@count1,3)=0 THEN
		ITERATE add_num;
	SELECT * FROM employee;
END LOOP add_num
登入後複製

6. REPEAT 语句

REPEAT 语句是由条件的控制循环语句,当满足特定条件就会退出循环语句

[begin_label:]REPEAT
	statement_list
	UNTIL search_condition
END REPEAT [end_label]
登入後複製
  • 参数 statement_list 表示需要循环执行的语句

  • 参数 search_condition 表示结束循环的条件,满足该条件即结束循环

下面是一个 REPEAT 语句的示例

add_num:REPEAT
	SELECT @count1=@count1+1;
	UNTIL @count1=100
END REPEAT add_num
登入後複製

7. WHILE 语句

WHILE 语句也是有条件控制的循环语句,与 REPEAT 语句不同的是,WHILE 语句是当满足条件时执行循环内的语句

[begin_label:]WHILE search_condition DO
	statement_list
END WHILE [end_label]
登入後複製
  • 参数 statement_list 表示需要循环执行的语句

  • 参数 search_condition 表示结束循环的条件,满足该条件即结束循环

下面是一个 WHILE 语句的示例

WHILE @count<100 DO
	SET @count=@count+1;
END WHILE;
登入後複製

6|0操作存储过程和函数

1. 调用存储过程

在 MySQL 中,使用 CALL 语句来调用存储过程

CALL proc_name([parameter[,...]])
登入後複製
  • proc_name 是存储过程的名称

  • paramter 是指存储过程的参数

2. 调用存储函数

在 MySQL 中,存储函数的使用方法和 MySQL 内部函数是一样的

3. 使用 SHOW STATUS 语句查看存储过程和函数的状态

SHOW {PROCEDURE|FUNCTION} STATUS{LIKE &#39;pattern&#39;}
登入後複製
  • 参数 PROCEDURE 表示查询存储过程,FUNCTION 表示存储函数

  • 参数 LIKE 'pattern' 用来匹配存储过程或函数的名称

4. 使用 SHOW CREATE 语句查看存储过程和函数的定义

SHOW CREATE {PROCEDURE|FUNCTION} proc_name
登入後複製

5. 从 information_schema.Routine 表中查看存储过程和函数的信息

SELECT * FROM information_schema.Routine
WHERE ROUTINE_NAME=&#39;proc_name&#39;
登入後複製

6. 修改存储过程和函数

ALTER {PROCEDURE|FUNCTION} proc_name[characteristic...];
characteristic:
	{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY{DEFINER|INVOKER}
|COMMENT &#39;string&#39;
登入後複製
  • 参数 proc_name 表示存储过程或函数的名称

  • 参数 characteristic 指定存储过程的特性:

    • CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句

    • NO SQL 表示子程序不包含 SQL 语句

    • READS SQL DATA 表示子程序中包含读数据的语句

    • MODIFIES SQL DATA 表示子程序中包含写数据的语句

  • SQL SECURITY{DEFINER|INVOKER} 指明谁有权限执行:

    • DEFINER 表示只有定义者才能执行

    • INVOKER 表示调用者可以执行

  • COMMENT 'string' 是注释信息

7. 删除存储过程和函数

通过 DROP 语句删除存储过程

DROP PROCEDURE proc_name;
登入後複製

通过 DROP FUNCTION 语句删除存储函数

DROP FUNCTION func_name;
登入後複製

以上是MySQL預存程序和函數怎麼創建的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL與其他編程語言:一種比較 MySQL與其他編程語言:一種比較 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

解決數據庫連接問題:使用minii/db庫的實際案例 解決數據庫連接問題:使用minii/db庫的實際案例 Apr 18, 2025 am 07:09 AM

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

laravel框架安裝方法 laravel框架安裝方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 解決MySQL模式問題:TheliaMySQLModesChecker模塊的使用體驗 Apr 18, 2025 am 08:42 AM

在使用Thelia開發電商網站時,我遇到了一個棘手的問題:MySQL模式設置不當,導致某些功能無法正常運行。經過一番探索,我找到了一個名為TheliaMySQLModesChecker的模塊,它能夠自動修復Thelia所需的MySQL模式,徹底解決了我的困擾。

MySQL:結構化數據和關係數據庫 MySQL:結構化數據和關係數據庫 Apr 18, 2025 am 12:22 AM

MySQL通過表結構和SQL查詢高效管理結構化數據,並通過外鍵實現表間關係。 1.創建表時定義數據格式和類型。 2.使用外鍵建立表間關係。 3.通過索引和查詢優化提高性能。 4.定期備份和監控數據庫確保數據安全和性能優化。

MySQL:解釋的關鍵功能和功能 MySQL:解釋的關鍵功能和功能 Apr 18, 2025 am 12:17 AM

MySQL是一個開源的關係型數據庫管理系統,廣泛應用於Web開發。它的關鍵特性包括:1.支持多種存儲引擎,如InnoDB和MyISAM,適用於不同場景;2.提供主從復制功能,利於負載均衡和數據備份;3.通過查詢優化和索引使用提高查詢效率。

See all articles