目录
1. 存储过程与函数的概念
2. 创建存储过程与函数
2.1. 参数列表
3. 使用变量
4. 定义条件与处理程序
1. 定义条件:
2. 定义处理程序:
3.六种定义处理程序的方法
方法一,捕获sqlstate_value
方法二,捕获mysql_error_code
方法三,先定义条件,然后调用
方法四,使用SQLWARNING
方法五,使用NOT FOUND
方法六,使用SQLEXCEPTION
5. 光标的使用
1. 声明光标:
2. 打开光标:
3. 使用光标:
4. 关闭光标:
6. 流程控制的使用
1. IF语句:
2. CASE语句:
3. LOOP语句:
4. LEAVE语句:
5. REPEAT语句:
6. WHILE语句:
7. 调用存储过程与函数
1. 存储过程的基本语法:
2. 存储函数的基本语法:
3.调用存储过程和存储函数的语法如下:
调用存储过程:
调用存储函数:
8. 查看存储过程与函数
1. 使用`SHOW STATUS`查看存储过程和存储函数:
2. 使用`SHOW CREATE`查看存储过程和存储函数的定义和创建语句:
3. 使用表中的元数据查看存储过程和存储函数:
9. 修改存储过程与函数
1. 修改存储过程的基本语法:
2. 修改存储函数的基本语法:
10. 删除存储过程与函数
1. 删除存储过程的基本语法:
2. 删除存储函数的基本语法:
MySQL中存储过程与函数是用于存储和执行SQL语句的一种方式,可以提高数据库的性能和安全性。
创建存储过程使用 `CREATE PROCEDURE` 语句,示例:
CREATE PROCEDURE procedure_name ([参数列表])
BEGIN
-- 存储过程的SQL语句
END;
创建函数使用 `CREATE FUNCTION` 语句,示例:
CREATE FUNCTION function_name ([参数列表])
RETURNS return_type
BEGIN
-- 函数的SQL语句
RETURN return_value;
END;
存储过程可以接收零个或多个参数,并且每个参数都有一个数据类型。参数可以是输入参数、输出参数或输入输出参数。
(parameter_name1 data_type [IN|OUT|INOUT] [DEFAULT default_value],
parameter_name2 data_type [IN|OUT|INOUT] [DEFAULT default_value], ...)
在存储过程中可以使用变量来存储临时数据。使用`DECLARE`语句来声明变量,示例:
DECLARE variable_name data_type [DEFAULT value];
变量的作用范围限于存储过程内部,在存储过程结束后会被销毁。
对于定义条件和处理程序,我们使用DECLARE和DECLARE HANDLER语法。
DECLARE condition_name CONDITION FOR condition_value;
示例:
DECLARE custom_error CONDITION FOR SQLSTATE '45000';
在这个示例中,我们使用DECLARE关键字定义了一个条件变量custom_error,与SQLSTATE '45000'相关联。
DECLARE handler_type HANDLER FOR condition_value action;
示例:
DECLARE CONTINUE HANDLER FOR custom_error
BEGIN
-- 执行操作,例如输出错误消息
SELECT 'An error occurred: Custom Error' AS message;
END;
在这个示例中,我们定义了一个处理程序,当满足custom_error条件时,程序将继续执行,并输出一条自定义的错误消息。
注意,条件和处理程序必须在BEGIN...END语句块内使用。只有在DECLARE HANDLER语句之前定义的条件和处理程序才能在块内使用。
DECLARE CONTINUE HANDLER FOR SQLSTATE ‘42S02’ SET @info=’NO_SUCH_TABLE’;
如果,遇到sqlstate_value值为’42S02’,则执行CONTINUE操作,并且,输出”NO_SUCH_TABLE”信息
DECLARE CONTINUE HANDLER FOR 1146 SET @info=’NO_SUCH_TABLE’;
如果,遇到mysql_error_code值为1146,则执行CONTINUE操作,并且,输出”NO_SUCH_TABLE”信息
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info=’ERROR’;
这里先定义no_such_table条件,遇到1146错误,就执行CONTINUE操作
DECLARE EXIT HANDLER FOR SQLWARNING SET @info=’ERROR’;
SQLWARNING捕获所有以01开头的,sqlstate_value值,然后,执行EXIT操作,并且,输出ERROR信息
DECLARE EXIT HANDLER FOR NOT FOUND SET @info=’NO_SUCH_TABLE’;
NOT FOUND捕获所有以02开头的sqlstate_value值,然后,执行EXIT操作,并且,输出”NO_SUCH_TABLE”信息
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info=’ERROR’;
SQLEXCEPTION捕获所有没有被SQLWARNING或NOT FOUND捕获的sqlstate_value值,然后,执行EXIT操作,并且,输出”ERROR”信息
定义条件和处理程序
在MySQL中,光标用于在存储过程或函数中处理查询结果集。使用光标可以按行遍历结果集,以便对每一行进行操作。光标的使用包括声明光标、打开光标、使用光标和关闭光标。
DECLARE cursor_name CURSOR FOR select_statement;
示例:
DECLARE employee_cursor CURSOR FOR SELECT * FROM employees;
在上述示例中,我们声明了一个名为`employee_cursor`的光标,用于处理`employees`表的结果集。
OPEN cursor_name;
示例:
OPEN employee_cursor;
在上述示例中,我们打开之前声明的`employee_cursor`光标。
使用光标的主要操作包括FETCH、LOOP和CLOSE。
FETCH:用于从结果集中获取下一行数据。
FETCH cursor_name INTO variable_list;
示例:
FETCH employee_cursor INTO @empId, @empName, @empSalary;
在上述示例中,我们使用`employee_cursor`光标从结果集中获取下一行数据,并将列值分别存储在`@empId`、`@empName`和`@empSalary`变量中。
LOOP:用于循环遍历光标的结果集。
LOOP_label: LOOP
-- 执行操作
-- 在每个迭代中,使用FETCH获取下一行数据
END LOOP;
LOOP_label:LOOP语句的标签,用于在需要的时候退出循环。示例:
employee_loop: LOOP
FETCH employee_cursor INTO @empId, @empName, @empSalary;
-- 执行操作,例如输出员工信息
IF condition THEN
LEAVE employee_loop; -- 根据条件跳出循环
END IF;
END LOOP employee_loop;
在上述示例中,我们循环遍历`employee_cursor`光标的结果集,通过FETCH获取每一行数据并执行相应的操作。根据特定条件,我们使用LEAVE语句跳出循环。
CLOSE cursor_name;
示例:
CLOSE employee_cursor;
在上述示例中,我们关闭之前打开的`employee_cursor`光标。
在MySQL中,流程控制语句用于控制程序的流程和执行顺序。常见的流程控制语句包括IF语句、CASE语句、LOOP语句、LEAVE语句、REPEAT语句和WHILE语句。
IF condition THEN
statements;
ELSEIF condition THEN
statements;
ELSE
statements;
END IF;
示例:
IF score > 90 THEN
SELECT '优秀';
ELSEIF score > 80 THEN
SELECT '良好';
ELSE
SELECT '及格';
END IF;
在上述示例中,根据`score`的值,会执行不同的语句块并输出相应的结果。
CASE expression
WHEN value1 THEN
statements;
WHEN value2 THEN
statements;
...
ELSE
statements;
END CASE;
示例:
CASE department
WHEN 'IT' THEN
SELECT 'Information Technology';
WHEN 'HR' THEN
SELECT 'Human Resources';
ELSE
SELECT 'Other Department';
END CASE;
在上述示例中,根据`department`的值,会执行相应的语句块并输出相应的结果。
label: LOOP
statements;
IF condition THEN
LEAVE label;
END IF;
END LOOP label;
示例:
employee_loop: LOOP
SELECT name INTO @employee_name FROM employees
WHERE department = 'IT' LIMIT 1;
-- 执行操作,例如输出员工信息
IF @employee_name IS NULL THEN
LEAVE employee_loop; -- 根据条件跳出循环
END IF;
END LOOP employee_loop;
在上述示例中,通过LOOP语句循环遍历`employees`表中的IT部门员工,执行相应的操作。当没有符合条件的员工时,使用LEAVE语句跳出循环。
LEAVE label;
label:要跳出的语句块的标签。
示例:
employee_loop: LOOP
-- 执行操作
IF condition THEN
LEAVE employee_loop; -- 根据条件跳出循环
END IF;
END LOOP employee_loop;
在上述示例中,使用LEAVE语句根据特定条件跳出循环。
REPEAT
statements;
IF condition THEN
LEAVE;
END IF;
UNTIL condition;
示例:
SET @count = 0;
REPEAT
SET @count = @count + 1;
SELECT @count;
IF @count = 5 THEN
LEAVE;
END IF;
UNTIL @count > 10;
在上述示例中,使用REPEAT语句循环输出数值,当`@count`等于5时,使用LEAVE语句跳出循环。
WHILE condition DO
statements;
END WHILE;
示例:
SET @count = 1;
WHILE @count <= 5 DO
SELECT @count;
SET @count = @count + 1;
END WHILE;
在上述示例中,使用WHILE语句循环输出数值,当`@count`小于等于5时,执行相应的语句,并每次循环后递增`@count`的值。
在MySQL中,可以使用存储过程和存储函数来封装一系列SQL语句,并根据需要进行调用。存储过程用于执行一系列操作,而存储函数则返回单个值。:
CREATE PROCEDURE procedure_name ([IN | OUT | INOUT] parameter_name data_type [, ...])
[characteristics]
BEGIN
-- 存储过程的执行逻辑
END;
示例:
CREATE PROCEDURE get_employee(IN empId INT)
BEGIN
SELECT * FROM employees WHERE employee_id = empId;
END;
在上述示例中,我们创建了一个名为`get_employee`的存储过程,它接收一个输入参数`empId`,并根据该参数查询符合条件的员工。
CREATE FUNCTION function_name ([parameter_name data_type [, ...]])
RETURNS return_type
[characteristics]
BEGIN
-- 存储函数的执行逻辑
RETURN value;
END;
示例:
CREATE FUNCTION calculate_total(salary INT, bonus INT) RETURNS INT
BEGIN
DECLARE total_salary INT;
SET total_salary = salary + bonus;
RETURN total_salary;
END;
在上述示例中,我们创建了一个名为`calculate_total`的存储函数,它接收两个输入参数`salary`和`bonus`,并返回它们的和作为函数的返回值。
CALL procedure_name([parameter_value, ...]);
示例:
CALL get_employee(1);
在上述示例中,我们调用了名为`get_employee`的存储过程,并传入参数值1,以获取员工ID为1的员工信息。
SELECT function_name([parameter_value, ...]);
示例:
SELECT calculate_total(3000, 500) AS total_salary;
在上述示例中,我们调用了名为`calculate_total`的存储函数,并传入参数值3000和500,以计算总工资,并将结果作为查询的结果进行返回。
在MySQL中,您可以使用不同的方法来查看存储过程和存储函数的详细信息,包括通过`SHOW STATUS`查看,通过`SHOW CREATE`查看,以及通过表中的元数据查看。
SHOW STATUS LIKE 'procedure';
SHOW STATUS LIKE 'function';
示例:
SHOW STATUS LIKE 'procedure';
SHOW STATUS LIKE 'function';
这些示例语句将显示与存储过程和存储函数相关的状态信息,包括存储过程和存储函数的计数和其他属性。
SHOW CREATE PROCEDURE procedure_name;
SHOW CREATE FUNCTION function_name;
示例:
SHOW CREATE PROCEDURE get_employee;
SHOW CREATE FUNCTION calculate_total;
这些示例语句将显示存储过程和存储函数的定义和创建语句,包括存储过程和存储函数的名称、参数、执行逻辑和返回值等详细信息。
您可以通过查询数据库中的特定表来查看存储过程和存储函数的元数据。以下是涉及的基本表和它们的解释:
示例:
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE';
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION';
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'get_employee';
SELECT * FROM information_schema.PARAMETERS WHERE SPECIFIC_NAME = 'calculate_total';
这些示例查询将返回存储过程和存储函数的详细信息,包括名称、参数、数据类型、执行逻辑等。
在MySQL中,可以使用`ALTER PROCEDURE`和`ALTER FUNCTION`语句来修改已存在的存储过程和存储函数的定义。
ALTER PROCEDURE procedure_name ([IN | OUT | INOUT] parameter_name data_type [, ...])
[characteristics]
[COMMENT 'new_comment']
BEGIN
-- 修改后的存储过程的执行逻辑
END;
示例:
ALTER PROCEDURE get_employee(IN empId INT)
BEGIN
SELECT * FROM employees WHERE employee_id = empId;
-- 修改后的逻辑
UPDATE employees SET salary = salary + 1000 WHERE employee_id = empId;
END;
在上述示例中,我们修改了名为`get_employee`的存储过程,增加了在查询员工信息后更新员工工资的逻辑。
ALTER FUNCTION function_name ([parameter_name data_type [, ...]])
RETURNS return_type
[characteristics]
[COMMENT 'new_comment']
BEGIN
-- 修改后的存储函数的执行逻辑
RETURN new_value;
END;
示例:
ALTER FUNCTION calculate_total(salary INT, bonus INT) RETURNS INT
BEGIN
DECLARE total_salary INT;
SET total_salary = salary + bonus;
-- 修改后的逻辑
SET total_salary = total_salary * 1.1;
RETURN total_salary;
END;
在上述示例中,我们修改了名为`calculate_total`的存储函数,增加了将总工资乘以1.1的逻辑,然后返回修改后的结果。
在MySQL中,您可以使用`DROP PROCEDURE`和`DROP FUNCTION`语句来删除已存在的存储过程和存储函数。
DROP PROCEDURE IF EXISTS procedure_name;
示例:
DROP PROCEDURE IF EXISTS get_employee;
在上述示例中,如果名为`get_employee`的存储过程存在,则将其删除。
DROP FUNCTION IF EXISTS function_name;
示例:
DROP FUNCTION IF EXISTS calculate_total;
在上述示例中,如果名为`calculate_total`的存储函数存在,则将其删除。
使用`DROP PROCEDURE`和`DROP FUNCTION`语句,您可以轻松删除已存在的存储过程和存储函数。通过指定要删除的存储过程或存储函数的名称,并使用`IF EXISTS`可选关键字,以确保在对象不存在时不会出现错误。