存储过程,函数,事务---随笔
数据库随笔
一、存储过程
1.创建
create proc 名称 (参数1...参数n)
begin
sql
end;
参数书写方式:[in|out|inout] 参数名 类型
注:sql默认(;)作为结束符,可以修改为 $$, 使用关键字 delimiter ,例:delimiter $$
2.调用
call 名称(@参数名)
一般参数名前默认@,算是一种规范
二、函数
1.与存储过程的区别:必须有返回值
2.创建:
create func 名称 (参数1...参数n)
begin
sql
end;
参数书写方式: 参数名 类型
三、操作变量
1.声明:declare 名字 类型 默认值 例:declare aaa int default 100;
2.赋值:set 变量 = 表达式 多个使用逗号隔开 例 :set aaa = 200;
也可以用到select语句中 select 字段 into 变量 from 表名 where 条件 前提是select查询结果是单行
例: select sal into aaa from 表名 where id = 1;
四:操作条件
1.条件定义: declare 条件名 Condition For 值
值有两种类型 (1)sqlstate_value (2)mysql_error_code 不明白自行百度或者翻书
2.处理程序定义:declare 处理类型 Handler For 值
处理类型有三种(1)continue(2)exit(3)undo
值有(1)sqlstate_value(2)条件名 --也就是上边的条件,可以自己定义一个(3)sqlwarning
(4)not found --遍历游标时经常使用,作为一种标记(5)sqlException(6)mysql_error_code
五:游标 --类似指针|数组的下标
1.声明:declare 游标名 Cusor For select语句
2.打开:open 游标名 --打开游标指向第一条记录之前
3.使用:fetch 游标名 into 变量名
4.关闭: close 游标名
5.遍历游标的三种方式:
(1)while ... end while 例:while flag = 1 do 自定义语句 end while -- flag什么时候为1呢(遍历完成),就是满足你的处理程序(比如 not found)|条件
(2)loop ... end loop
(3)repeat ... end repeat
六:流程控制语句
1.条件控制语句
(1)if
例: if 条件 then 语句
[elseif 条件 then 语句]
[else 语句]
end if;
(2)case
例:case 值
when 条件 then 语句
...
else 语句
end case;
2.循环控制语句
(1)loop (2)while -> 满足条件->执行 (3)repeat -> 满足条件 -> 退出
(1)loop
例: [begin_label:]loop
语句
end loop [end_label]
注:begin_label 和 end_label 作为开始或者结束的标记,且必须相同,可省略
想退出循环 使用leave关键字 例 leave flag = 1
(2)while
[begin_label:] while 条件 do 语句
end while [end_label]
(3)repeat
[begin_label:] repeat条件 do 语句
end repeat [end_label]
注: 跳出时 until 条件 例 until flag = 1
七:事务
1.特性
(1)原子性 A(2)一致性 C(3)隔离性 I(4)持久性 D
2.与事务相关的日志 :redo日志 和 undo 日志
3.隔离级别:
id name
1 zhangsan
2 lisi
3 wangwu
(1)读未提交-> 脏读 例: a 开启事务将zhangsan 更新成zhangsansan b事务这时读取是zhangsansan a这时没有提交,回滚事务了,这个过程b是看到的数据并不是真实的,称为脏读
(2)读已提交 -> 不可重复读 例: a 开启事务 select查看三条数据 ,b 开启事务把 zhangsan 更新为 zhangsansan 并提交 ,a 这是select 三条数据和上次看到的不一样,称为不可重复读
(3)可重复读->幻读 例:a开启事务 select 三条数据 ,b 开启事务insert 一条数据并提交,a 再select依旧是三条(a再没提交之前保证读取到的一样),a提交事务,a 再select 是四条,三四不一致,称为幻读
(4)可串行化
ddl语句会造成事务的隐式提交