oracle:存储过程和触发器

时间:2024-10-10 15:35:56

存储过程(stored procedure) :可以看作带名字的pl/sql程序块;通过名字调用执行;可以带参数或不带参数。

触发器(trigger):通过事件触发执行,可看成特殊类型的存储过程。

下图建立了一个acc存储过程,显示account账户的id 及其对应的money值:

存储过程执行:1.exec p;        2. begin

  p;

                end;

                /

oracle:存储过程和触发器

下面存储过程,给收入在[1000,2000)区间的用户增加1块收入,给给收入在[2000,3000)区间的用户增加2块收入.

执行后显示:

oracle:存储过程和触发器

触发器:

两个示例:1.创建操作日志               2.修改数据库的外键关联

1.创建操作日志:

oracle:存储过程和触发器

创建触发器:before /after   insert or deleteor update on account(可同时多个触发事件用or隔开即可)

oracle:存储过程和触发器

执行操作,看是否自动计入acclog表

oracle:存储过程和触发器

2.使用触发器修改被参考项的外键关联(有副作用,尽量少用)

作用:可以让已被参考的外键项实现子项和父项的关联更改;

侧效:子项和父项信息都可能会关联其它信息,这时是否、能否需要进行关联改变或其它操作要考虑,小心蝴蝶效应。

dept.id 是 emp表中的主外键;

emp表

oracle:存储过程和触发器

oracle:存储过程和触发器

dept表:

oracle:存储过程和触发器

oracle:存储过程和触发器

这时:

emp中的depno值可以改变(只要在dept.id中有对应值,有父项关键字)

oracle:存储过程和触发器

oracle:存储过程和触发器

oracle:存储过程和触发器

而dept中的已被参考项不可更改:

oracle:存储过程和触发器

可以使用触发器  :NEW            :OLD          实现关联修改:

oracle:存储过程和触发器

EMP中实现了关联更改

oracle:存储过程和触发器

oracle:存储过程和触发器

仅提供一种功能描述,注意具体使用场景。小心使用!注意侧效!

注意commit提交,不然不同终端的显示结果不同:

oracle:存储过程和触发器

右图中cmd环境,不提交退出,其实这条update语句会回滚,不会有任何作用。

重新登入查询,dept没有数据更新。

oracle:存储过程和触发器