1.0 建立預存程序和函數
建立預存程序和函數就是將常用的一組SQL 語句組合在一起,並將這些SQL 語句當作一個整體儲存在MySQL 伺服器
1. 建立預存程序
CREATE PROCEDURE procedure_name ([proc_param[,...]]) [characteristic ...] routine_body
procedure_name 表示所要建立的預存程序的名稱
- ##proc_param 表示預存程序的參數
- characteristic 表示預存程序的特性
- routine_body 表示預存程序的SQL 語句
[ IN | OUT | INOUT ] param_name typecharacteristic 指定預存程序的特性,有以下取值:
- ##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 中每個參數的語法形式如下,分別為參數名稱和參數類型
或先前的範例
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 'pattern'}
参数 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='proc_name'
6. 修改存储过程和函数
ALTER {PROCEDURE|FUNCTION} proc_name[characteristic...]; characteristic: {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA} |SQL SECURITY{DEFINER|INVOKER} |COMMENT 'string'
参数 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中文網其他相關文章!

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。