一,存储过程: 就是给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) //如果新值小于旧值