oracle:存储过程和触发器
存储过程(stored procedure) :可以看作带名字的pl/sql程序块;通过名字调用执行;可以带参数或不带参数。
触发器(trigger):通过事件触发执行,可看成特殊类型的存储过程。
下图建立了一个acc存储过程,显示account账户的id 及其对应的money值:
存储过程执行:1.exec p; 2. begin
p;
end;
/
下面存储过程,给收入在[1000,2000)区间的用户增加1块收入,给给收入在[2000,3000)区间的用户增加2块收入.
执行后显示:
触发器:
两个示例:1.创建操作日志 2.修改数据库的外键关联
1.创建操作日志:
创建触发器:before /after insert or deleteor update on account(可同时多个触发事件用or隔开即可)
执行操作,看是否自动计入acclog表
2.使用触发器修改被参考项的外键关联(有副作用,尽量少用)
作用:可以让已被参考的外键项实现子项和父项的关联更改;
侧效:子项和父项信息都可能会关联其它信息,这时是否、能否需要进行关联改变或其它操作要考虑,小心蝴蝶效应。
dept.id 是 emp表中的主外键;
emp表
dept表:
这时:
emp中的depno值可以改变(只要在dept.id中有对应值,有父项关键字)
而dept中的已被参考项不可更改:
可以使用触发器 :NEW :OLD 实现关联修改:
EMP中实现了关联更改
仅提供一种功能描述,注意具体使用场景。小心使用!注意侧效!
注意commit提交,不然不同终端的显示结果不同:
右图中cmd环境,不提交退出,其实这条update语句会回滚,不会有任何作用。
重新登入查询,dept没有数据更新。