存储过程
概念:用于编写能够完成某项工作的一组SQL语句集合,其中包括一些T-SQL(Trasaction-SQL)语句来接收数据、操作数据、逻辑判断,存储过程经过编译后,存储在数据库中,可以直接调用。存储过程可编程可修改,多次执行不会重复编译,所以提高了查询速度。本篇主要讲述MySQL中创建和调用存储过程。
创建和调用格式
/*DELIMITER声明分隔符为 // */
DELIMITER //
CREATE PROCEDURE a(IN b char(20))
BEGIN
SELECT b;
END//
/*分隔符还原*/
DELIMITER ;
/*调用存储过程*/
SET @str = 'helloworld';
CALL a(@str);
/*删除存储过程*/
DROP PROCEDURE a;
(1) 修改分隔符,因为原来的语句分隔符为";",所以MySQL会将存储过程当做SQL语句执行,这样存储过程中的SQL语句会在创建时就执行,报错。改成“//”后就不会执行以";" 结尾的SQL语句,在创建完存储过程之后要将分隔符重新修改成";"。(2)存储过程的程序体包含在BEGIN...END中。
(3)通过call关键字调用存储过程,在调用时如果有参数列表,要传入参数。
触发器
概念:触发器是关联一个表的数据对象,他不用手动调用。当其关联表触发了触发器声明的特殊操作时,会自动激活触发器,执行触发器中的SQL语句。触发器是一类特殊的存储过程,当有操作影响到关联表时,触发器自动执行。
触发器的创建
(1)创建a表
CREATE TABLE a
(
info DATE
);
(2)创建b表
CREATE TABLE b
(
id INT AUTO_INCREMENT,
NAME VARCHAR(40),
PRIMARY KEY (id)
);
(3)创建触发器关联b表,使每次b表有数据插入时,都在a表中插入插入数据的时间。
DELIMITER //
CREATE TRIGGER mytrigger
AFTER INSERT
ON b
FOR EACH ROW
BEGIN
INSERT INTO a(info) VALUE(NOW());
END//
DELIMITER ;
(4)测试结果INSERT INTO b VALUES(2,'老王')表b:
表a: