老二牛车第八章上机课触发器和内置程序包.pdf
根据提供的文件信息,我们可以深入探讨Oracle数据库中的两个关键概念——触发器与内置程序包,并具体分析文件中提及的两种触发器实例。 ### 触发器概述 触发器是一种存储过程,它定义为当特定事件(如数据修改)发生时自动执行。在Oracle数据库中,触发器分为两大类:语句级触发器和行级触发器。 - **语句级触发器**:每当对指定表执行DML(数据操纵语言)操作时,如INSERT、UPDATE或DELETE,触发器将执行一次。这类触发器通常用于实施安全性措施或者审计跟踪。 - **行级触发器**:对于每个受影响的行,触发器都将执行一次。行级触发器非常适合于执行基于每一行数据的操作,例如计算字段值或执行特定业务逻辑。 ### 内置程序包 Oracle提供了许多内置程序包,这些程序包包含预定义的函数和过程,用于执行常见的数据库任务,从而简化开发人员的工作并提高效率。例如,`DBMS_OUTPUT`是一个常用的内置程序包,用于向控制台输出信息。 ### 实例分析 #### 1. 语句级触发器示例 **需求说明**:记录所有对`itemfile`表进行的更新操作,但不记录具体的更新数据。 **实现思路**:创建一个名为`itemfile_log`的日志表来记录谁进行了操作、何时操作以及进行了哪种类型的DML操作。接着,在`itemfile`表上创建一个语句级触发器,该触发器在执行INSERT、UPDATE或DELETE操作时激活。 **参考步骤**: 1. 启动SQL\*Plus。 2. 创建日志表`itemfile_log`。 ```sql CREATE TABLE itemfile_log ( who VARCHAR2(30), when DATE, action VARCHAR2(20) ); ``` 3. 创建语句级触发器`modify_itemfile`。 ```sql CREATE OR REPLACE TRIGGER modify_itemfile BEFORE INSERT OR UPDATE OR DELETE ON itemfile DECLARE l_action itemfile_log.action%TYPE; BEGIN IF INSERTING THEN l_action := '插入'; ELSIF UPDATING THEN l_action := '更新'; ELSIF DELETING THEN l_action := '删除'; END IF; INSERT INTO itemfile_log (who, When, action) VALUES (USER, SYSDATE, l_action); END; / ``` 4. 测试触发器。 - 更新`itemfile`表: ```sql UPDATE itemfile SET itemrate = itemrate + 20 WHERE itemcode = 'i205'; ``` - 查看日志表`itemfile_log`: ```sql SELECT * FROM itemfile_log; ``` **效果验证**:执行上述步骤后,`itemfile_log`表应显示相应的更新记录,但不包括具体的更新数据。 #### 2. 行级触发器示例 **需求说明**:在订单条目表中,需要根据产品的数量和单价自动计算出每种产品的总金额。 **实现思路**:创建一个名为`order_item`的表,包含产品编号、数量、单价和总金额等字段。利用行级触发器,在插入或更新`quantity`和`price`字段时自动计算`total`字段的值。 **参考步骤**: 1. 启动SQL\*Plus。 2. 创建`order_item`表。 ```sql CREATE TABLE order_item ( prod_id VARCHAR2(6), quantity NUMBER(3), price NUMBER(6, 2), total NUMBER(8, 2) ); ``` 3. 创建行级触发器`biu_total_orderitem`。 ```sql CREATE OR REPLACE TRIGGER biu_total_orderitem BEFORE INSERT OR UPDATE OF quantity, price ON order_item FOR EACH ROW BEGIN :NEW.total := :NEW.quantity * :NEW.price; END; / ``` 4. 测试触发器。 - 插入数据到`order_item`表: ```sql INSERT INTO order_item (prod_id, quantity, price) VALUES ('P001', 5, 56.00); INSERT INTO order_item (prod_id, quantity, price) VALUES ('P002', 3, 128.00); ``` **效果验证**:在插入数据后,`order_item`表中的`total`字段应自动填充为相应的计算结果,即`P001`的总金额为`280.00`,`P002`的总金额为`384.00`。 通过这两个实例,我们不仅学习了如何使用Oracle数据库中的触发器来实现特定的业务逻辑,还掌握了如何利用内置程序包简化开发工作。触发器是Oracle数据库中一项非常强大的功能,合理地运用它们可以极大地提高数据库应用程序的安全性和效率。
- 粉丝: 21
- 资源: 132
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Java和MySQL的学生信息管理系统.zip
- (源码)基于ASP.NET Core的零售供应链管理系统.zip
- (源码)基于PythonSpleeter的戏曲音频处理系统.zip
- (源码)基于Spring Boot的监控与日志管理系统.zip
- (源码)基于C++的Unix V6++二级文件系统.zip
- (源码)基于Spring Boot和JPA的皮皮虾图片收集系统.zip
- (源码)基于Arduino和Python的实时歌曲信息液晶显示屏展示系统.zip
- (源码)基于C++和C混合模式的操作系统开发项目.zip
- (源码)基于Arduino的全球天气监控系统.zip
- OpenCVForUnity2.6.0.unitypackage