一,存储过程:
就是给pl/sql块起个名字,封装了这些逻辑代码,面向的是过程编程!
- 新建一个存储过程:
1,在dos命令窗口执行一个存储过程:
set serveroutput on;
exec zss;
2,在sql窗口调用存储过程:把zss当做一个方法调用。
declare
begin
zss();
end;
- 存储过程还可以传参,传参有3中
- 只进不出型:(in)参数只传进去,不传出来,只可以手动往里面加,不能在存储过程里面改,一改就报错
- 只出不进型:(out):这时只按照存储过程里面的参数为基准,虽然你也传了参数,但是你传进去的参数不会运行。
结果:
- 默认就是参数有进有出:(in out),传进去一个参数。必然有一个参数响应传出来。求一个数的开方。
二,两种调用存储过程的方法:
注意:形参varchar不需要定义大小,因为才要进去捞值,不能限制它的大小
案例:输入员工编号,给员工涨工资
10部门涨10%;
20部门涨20%;
30部门涨30%;
40部门涨40%;
输出涨后的工资
涨工资存储过程:
1,sql窗口调用涨工资存储过程:一个是实参,进去参加存储过程,一个是形参,只做一个定义
2,java调用涨工资存储过程: - 注意:程序运行的时候,会在ct.executeUpdate();阻塞,因为sql客户端调用存储过程后会自动上乐观锁。等到它commit提交释放锁之后java才能执行,而java是自动提交释放锁的,所以java不需要释放锁,sql客户端也可以执行。
- 存储过程和视图的区别
存储过程是面向过程编码,视图是面向查询结果
存储过程里可以写pl/sql ,视图里只能写sql
**三,自定义函数:**自定义一个平方函数
注意:定义一个number类型,就返回一个number类型。
调用函数:
select pingfang(5) from dual;
- 自定义函数和存储过程的区别
1:函数必须有返回值,并且只能有一个返回值,存储过程没有返回值,但是有出参, 可以有多个出参
2:函数只能通过select语句去调用,存储过程可以通过3种方式调用(sql窗口,dos窗口,java)
四,触发器
时间模型,针对 一个事件可以触发一个响应,就比如before触发,执行事件前先要执行触发器
1,创建一个触发器:
在执行插入语句之前,触发器先执行,然后再插入。这是before,还有after(在执行之后执行触发器)等不常用的触发器
- 语句触发器
练习:银行上班期间,9-17上班,在这之外不办理业务,提示系统已关闭!(触发器在语句执行之前先执行,如果不在上班范围期间,报一个错)
这里可以给添加,删除,修改都加上触发器。报出如下错误,如果想测试成功操作,判断between and 之前加not即可。
insert into dept values(80,'ass','zzdd')
- 行级触发器:
语句触发器和行级触发器的区别:
行级触发器对DML语句影响的每个行执行一次. 语句级触发器对每个DML语句执行一次, (如果一条insert语句在一个表中插入500行, 那么这个表的语句级触发器只执行一次, 而行级触发器要执行500次) 可以按字面意思理解: 行级触发器针对行, 语句级触发器针对语句(一个语句可以包含多行).
案例:给员工涨工资,不能低于之前的工资,否则就报错!
before update of sal on emp //代表在修改emp下的sal之前触发
for each row //代表作用与每一行的sal
if(:new.sal<:old.sal) //如果新值小于旧值