什么是存储过程?
存储过程像是sql中的方法,在存储过程中可以利用代码逻辑去实现一些功能。可以定义变量,if判断,while,lomp循环。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。存储过程可以减少sql代码量,同时使用存储过程数据更加安全,支付功能均采用存储过程对数据进行处理。
语法:
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体
DROP PROCEDURE IF EXISTS 过程名;
创建存储过程
DELIMITER // -- 可以不写,end后写;
CREATE
PROCEDURE 过程名(参数)
BEGIN
过程体
END//
DELIMITER;
参数权限
in:参数的值不能返回,可以使用,类似函数传递值的使用,默认为in。
out:参数的值可以用来返回,在存储过程中为null,可以给他赋值返回。
inout:参数的值可以使用,可以用来返回,类似函数传递地址使用。
定义变量
语法:SET 变量名 = 变量值 [,变量名= 变量值 …] / DECLEAR 变量名 = 变量值 变量类型 【default 默认值】
set赋值的为全局变量,加@,declear声明的为局部变量,不加@。
用户变量一般以@开头
注意:滥用用户变量会导致程序难以理解及管理
CREATE
PROCEDURE 过程名(参数)
BEGIN
-- 定义变量
DECLARE 变量名 类型 [DEFAULT 0]默认值;
过程体
END;
if判断
if 条件 then 语句1 else 语句2 end if;
IF t_error = 1 THEN --判断
ROLLBACK; --回滚
ELSE
COMMIT; --提交
END IF;
while循环
DECLARE 变量名 int DEFAULT 0 ;
WHILE 变量名<5 DO
INSERT INTO smbms_type(typename,typepid) values("1",1);
set i = i+1;
end WHILE;
在存储过程使用事务
CREATE
PROCEDURE 过程名(参数)
BEGIN
DECLARE t_error INTEGER DEFAULT 0; --定义变量
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; --异常时触发
START TRANSACTION; --开启事务
-- 过程体
IF t_error = 1 THEN --判断
ROLLBACK; --回滚
ELSE
COMMIT; --提交
END IF;
Select t_error ; --返回状态
END;
在存储过程中使用其他表的数据
select typename into @tn from smbms_type where typeid = 2;
调用存储过程
Call 过程名(参数.....)
触发器
触发器是指对数据进行 增删改 的 **之前 **或者 **之后 **对数据的处理,语法与存储过程相似。(为一张表绑定一段sql,表进行增删改后自动触发sql)
一般删除之前对数据进行处理,用关键字old.属性代表之前的值,增加或修改之后对数据进行处理,用new.属性代表之前的值。例如:删除课程表course的c_id之前删除成绩表score的c_id对应的数据。
新增成绩之后,在课程表添加课程信息。
使用触发器:
设计表,对某一个属性添加触发器,在下栏定义写操作体,begin end不加;在内部添加语句。(没有提示)
delimiter 自定义结束符号
create trigger 触发器名字 触发时间 触发事件 on 表 for each row
begin
-- 触发器内容主体,每行用分号结尾
end
自定义的结束符合
delimiter ;
删除触发器:
触发器不能修改,只能删除
语法:drop trigger + 触发器名字