MySQL之函数、存储过程及触发器
发布时间:2023-07-29 15:12:40 所属栏目:MySql教程 来源:
导读:MySQL中函数、存储过程和触发器现在用得不多了,做了解就可以,因为现在数据库性能是很多系统的瓶颈了,这些操作都可以在数据库外由专业的编程语言如java等来完成,以减轻数据库负担,数据库只负责数据存储。
函
函
MySQL中函数、存储过程和触发器现在用得不多了,做了解就可以,因为现在数据库性能是很多系统的瓶颈了,这些操作都可以在数据库外由专业的编程语言如java等来完成,以减轻数据库负担,数据库只负责数据存储。 函数 系统函数和自定义函数 系统函数:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html 自定义函数 (user-defined function UDF) 保存在mysql.proc表中 创建UDF: CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...]) RETURNS {STRING|INTEGER|REAL} runtime_body 说明: 参数可以有多个,也可以没有参数 必须有且只有一个返回值 自定义函数 查看函数列表: SHOW FUNCTIOIN STATUS; 查看函数定义 SHOW CREATE FUNCTION function_name 删除UDF: DROP FUNCTION function_name 调用自定义函数语法: SELECT function_name(parameter_value,...) 示例:无参UDF CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!"; 示例:有参数UDF DELIMITER // CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20) BEGIN DELETE FROM students WHERE stuid = uid; RETURN (SELECT COUNT(uid) FROM students); END// DELIMITER ; 自定义函数中定义局部变量语法: DECLARE 变量1[,变量2,... ]变量类型 [DEFAULT 默认值] 说明:局部变量的作用范围是在BEGIN...END程序中,而且定义局部变量语句必须在BEGIN...END的第一行定义 示例: DELIMITER // CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED) RETURNS SMALLINT BEGIN DECLARE a, b SMALLINT UNSIGNED DEFAULT 10; SET a = x, b = y; RETURN a+b; END// 为变量赋值语法 SET parameter_name = value[,parameter_name = value...] SELECT INTO parameter_name 示例: ... DECLARE x int; SELECT COUNT(id) FROM tdb_name INTO x; RETURN x; END// 存储过程 存储过程保存在mysql.proc表中 创建存储过程 CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) routime_body 其中:proc_parameter : [IN|OUT|INOUT] parameter_name type 其中IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型 查看存储过程列表 SHOW PROCEDURE STATUS 查看存储过程定义 SHOW CREATE PROCEDURE sp_name 调用存储过程: CALL sp_name ([ proc_parameter [,proc_parameter ...]]) CALL sp_name 说明:当无参时,可以省略"()",当有参数时,不可省略"()” 存储过程修改: ALTER语句修改存储过程只能修改存储过程的注释等无关紧要的东西,不能修改存储过程体,所以要修改存储过程,方法就是删除重建 删除存储过程: DROP PROCEDURE [IF EXISTS] sp_name 创建无参存储过程: delimiter // CREATE PROCEDURE showTime() BEGIN SELECT now(); END// delimiter ; CALL showTime; 创建含参存储过程:只有一个IN参数 delimiter // CREATE PROCEDURE seleById(IN id SMALLINT UNSIGNED) BEGIN SELECT * FROM students WHERE stuid = id; END// delimiter ; call seleById(2); 示例 delimiter // CREATE PROCEDURE dorepeat(p1 INT) BEGIN SET @x = 0; REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT; END // delimiter ; CALL dorepeat(1000); SELECT @x; 创建含参存储过程:包含IN参数和OUT参数 delimiter // CREATE PROCEDURE deleteById(IN id SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED) BEGIN DELETE FROM students WHERE stuid = id; SELETE row_count() into num; END// delimiter ; call seleById(2,@Line); SELETE @Line; 说明:创建存储过程deleteById,包含一个IN参数和一个OUT参数.调用时,传入删除的ID和保存被修改的行数值的用户变量@Line,select @Line;输出被影响行数 存储过程优势: 存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程 提高了运行速度 同时降低网络数据传输量 存储过程与自定义函数的区别: 存储过程实现的过程要复杂一些,而函数的针对性较强 存储过程可以有多个返回值,而自定义函数只有一个返回值 存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用 流程控制 存储过程和函数中可以使用流程控制来控制语句的执行 流程控制: IF:用来进行条件判断。根据是否满足条件,执行不同语句 CASE:用来进行条件判断,可实现比IF语句更复杂的条件判断 LOOP:重复执行特定的语句,实现一个简单的循环 LEAVE:用于跳出循环控制 ITERATE:跳出本次循环,然后直接进入下一次循环 REPEAT:有条件控制的循环语句。当满足特定条件时,就会跳出循环语句 WHILE:有条件控制的循环语句 触发器 触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发、激活从而实现执行 创建触发器 CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body 说明: trigger_name:触发器的名称 trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发(在事件之前触发的话,事件会被替代) trigger_event::{ INSERT |UPDATE | DELETE },触发的具体事件 tbl_name:该触发器作用在表名 触发器示例 CREATE TABLE student_info ( stu_no INT(11) NOT NULL AUTO_INCREMENT, stu_name VARCHAR(255) DEFAULT NULL, PRIMARY KEY (stu_no) ); CREATE TABLE student_count ( student_count INT(11) DEFAULT 0 ); INSERT INTO student_count VALUES(0); 示例:创建触发器 在向学生表INSERT数据时,学生数增加,DELETE学生时,学生数减少 CREATE TRIGGER trigger_student_count_insert AFTER INSERT ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count+1; CREATE TRIGGER trigger_student_count_delete AFTER DELETE ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count-1; 查看触发器 SHOW TRIGGERS 查询系统表information_schema.triggers的方式指定查询条件,查看指定的触发器信息。 mysql> USE information_schema; Database changed mysql> SELECT * FROM triggers WHERE trigger_name='trigger_student_count_insert'; 删除触发器 DROP TRIGGER trigger_name; (编辑:聊城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐