ORACLE触发器、内置程序包教学

合集下载

触发器

触发器

内置程序包
• DBMS_LOB 包提供用于处理大型对象的过程和 函数
• DBMS_XMLQUERY 包用于将查询结果转换为 XML 格式
DBMS_LOB
--创建表 create table lob_table ( key_value int primary key, f_lob Bfile );
变异表
• 变异表是触发器触发源正在次修改的表或被修改者的级联表, 如果行级触发器的执行语句修改的表是变异表中的记录,会 导致一个死循环,系统会自动检测并抛出异常
• 例:如果修改学生性别时,就修改姓名
create or replace trigger stuinfo_trig before update of stusex –当修改列stusex触发 on stuinfo for each row begin
BEGIN result := DBMS_XMLQuery.getXml(‘SELECT empno, ename FROM emp’);--将查询结果转为XML格式,返回结果为长文本类型 xmlstr := DBMS_LOB.SUBSTR(result,32767);--对长文本截取为字符串 LOOP EXIT WHEN xmlstr IS NULL;
• DBMS_RANDOM .string(‘x’ , 10);
• DBMS_RANDOM.random();
DBMS_RANDOM
- -产生20个随机数 declare
num int; str varchar2(20); begin for i in 1..20 loop
str:=dbms_random.string('x', 10); num:=dbms_random.random( ); dbms_output.put_line(str || ',‘ || num); end loop; end; /

Oracle_PLSQL教程-第十章

Oracle_PLSQL教程-第十章

翻译:陈拓 chentuo@2006 年 6 月16 日更多触发器概念Copyright © Oracle Corporation, 2001. All rights reserved.进度表: 时间 主题80 分钟 讲演40 分钟 练习120 分钟 总共目标完成本课程后, 您应当能够:• 创建附加的数据库触发器• 解释触发器管理规则• 实现触发器10­2 Copyright © Oracle Corporation, 2001. All rights reserved.本课目标在本课中,你将学习怎样创建更多地数据库触发器并学习规则触发器。

你还将学习许多应用程序触发器。

创建数据库触发器• 触发用户事件:– CREATE, ALTER 或 DROP– Logging on 或 off• 触发数据库或系统事件:– Shutting down 或 starting up 数据库– 一个指定的错误 (或任何错误) 出现10­3 Copyright © Oracle Corporation, 2001. All rights reserved.创建数据库触发器在编码触发器体之前,确定触发器的组建。

在系统事件上的触发器可以被定义在数据库或方案级别。

例如,一个数据库 shutdown 触发器 被定义在数据库级别。

在数据定义语言 (DDL) 语句上的触发器,或一个用户登录登出,即可以被 定义为数据库级别也可以被定义为方案级别。

在 DML 语句上的触发器被定义在指定的表或一个视图上。

一个定义在数据库级别的触发器对所有用户触发, 一个定义在方案或表级别的触发器只有当触 发级别包括该方案或表时才触发。

触发事件可能引起触发器触发:· 在数据库或方案中的一个对象上一个数据定义语句· 一个指定的用户 (或任何用户) 登录或登出· 一个数据库关闭或启动· 一个指定的或任何错误出现在 DDL 语句上创建触发器• 语法:CREATE [OR REPLACE] TRIGGER trigger_nametiming[ddl_event1 [OR ddl_event2 OR ...]]ON {DATABASE|SCHEMA}trigger_body10­4 Copyright © Oracle Corporation, 2001. All rights reserved.创建触发器语法DDL 事件 可能的值CREATE无论何时一个 CREATE 语句添加一个新的数据库对象到数据字典中时,引起 Oracle 服务器激发触发器ALTER无论何时一个 ALTER 语句修改一个在数据字典中的数据库对象时,引起 Oracle 服务器激发触发器DROP无论何时一个 DROP 语句删除一个在数据字典中的数据库对象时,引起Oracle 服务器激发触发器触发器体代表一个完整的 PL/SQL 块。

触发器详解

触发器详解

进度表:时间主题80 分钟讲演40 分钟练习 120分钟总共9-2Copyright ©Oracle Corporation, 2001. All rights reserved.目标完成本课程后, 您应当能够:•描述不同触发器类型的区别•描述数据库触发器和它们的用途•创建数据库触发器•描述数据库触发器的点火(firing ) 规则•删除触发器本课目标在本课中,你将学习怎样创建和使用数据库触发器。

9-3Copyright ©Oracle Corporation, 2001. All rights reserved.触发器的类型触发器:•是一个PL/SQL 块或是与表、视图方案或数据库关联的PL/SQL 过程•当特定的事件发生时隐式执行•触发器可以是:–应用程序触发器:当一个特定应用程序的事件发生时触发–数据库触发器:当数据事件(例如DML) 在一个方案上发生或系统事件(例如登录或关闭数据库) 在数据库上发生时触发触发器的类型在一个应用程序中,当一个特殊的数据操纵语言 (DML) 事件发生时,应用程序触发器隐式地执行。

一个广泛使用触发器的应用程序的例子是用 Oracle Forms Developer 开发的应用程序。

当一个表上的象 DML 这样的数据事件 (INSERT 、UPDATE 或 DELETE 触发语句),或在一个视图上的 INSTEAD OF 触发器,或象 CREATE 和 ALTER 这样的数据定义语言 (DDL) 语句被发布时,数据库触发器隐式地执行,不论哪一个用户被连接或哪一个应用程序被使用。

当一些用户行为或数据库系统行为发生时,例如,当用户登录时,或 DBA 关闭 (shutdown) 数据库时,数据库触发器也会隐式地执行。

注:数据库触发器可以被定义在表或视图上。

如果一个 DML 操作在一个不可更新的视图上被发布,INSTEAD OF 触发器定义那些会发生的行为。

oracle 触发器工作原理

oracle 触发器工作原理

oracle触发器工作原理Oracle数据库中的触发器是一种存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。

触发器可以用于实现数据一致性、审计、业务规则验证和复杂的数据处理逻辑。

以下是Oracle触发器工作原理的基本概述:1.定义与激活:在Oracle中,通过使用CREATE TRIGGER语句创建触发器,指定其名称、触发时机(BEFORE或AFTER)、触发事件(INSERT、UPDATE、DELETE或COMMIT等)以及作用的对象(表或视图)。

2.触发时机:BEFORE触发器会在实际操作之前执行,此时可以查看并修改将要插入、更新或删除的数据。

AFTER触发器则在实际操作完成之后执行,此时只能查看已经更改后的结果。

3.触发上下文:对于INSERT操作,触发器可以通过:NEW伪记录访问被插入的新行数据。

对于UPDATE操作,触发器同时可以获得:OLD和:NEW伪记录,分别代表更新前的老数据和更新后的新数据。

对于DELETE操作,触发器可以通过:OLD伪记录访问即将被删除的行数据。

4.执行逻辑:触发器内的PL/SQL代码会根据触发条件进行执行,可以包含任何合法的PL/SQL命令,包括对其他表的操作、控制流语句、异常处理等。

5.事务处理:触发器是事务的一部分,所以它们遵循ACID属性,并且其行为受当前事务的影响。

例如,如果事务回滚,则触发器所做的所有变更也会随之回滚。

6.实例应用:举例来说,一个AFTER INSERT触发器可能用来记录新插入数据到审计表中;而一个BEFORE UPDATE触发器可能用于检查更新的数据是否满足某些业务规则,如果不满足则阻止更新操作。

总之,Oracle触发器是数据库系统内嵌的一种自动化机制,它在特定数据库事件发生时自动执行预定义的逻辑,为确保数据完整性和业务规则得以强制执行提供了强大的支持。

Oracle触发器trigger详解

Oracle触发器trigger详解

Oracle触发器trigger详解触发器相关概念及语法,供⼤家参考,具体内容如下概述本篇博⽂中主要探讨以下内容:什么是触发器触发器的应⽤场景触发器的语法触发器的类型案例数据:触发器的概念和第⼀个触发器数据库触发器是⼀个与表相关联的,存储的PL/SQL 语句。

每当⼀个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle⾃动执⾏触发器中定义的语句序列。

举个简单的例⼦:当员⼯表中新增⼀条记录后,⾃动打印“成功插⼊新员⼯”create or replace trigger insertStaffHintafter insert on xgj_testfor each rowdeclare-- local variables herebegindbms_output.put_line('新增员⼯成功');end insertStaffHint;触发器的应⽤场景复杂的安全性检查数据的确认数据库审计数据的备份和审计触发器的语法CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER }{INSERT | DELETE | UPDATE [OF column [, column …]]}[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]ON [schema.]table_name | [schema.]view_name[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}][FOR EACH ROW ][WHEN condition]PL/SQL_BLOCK | CALL procedure_name;其中:BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发⽅式,前触发是在执⾏触发事件之前触发当前所创建的触发器,后触发是在执⾏触发事件之后触发当前所创建的触发器。

Oracle触发器操作

Oracle触发器操作

AS
SELECT * FROM Users
WHERE u_Name='amy';

(2)创建行级触发器

CREATE OR REPLACE TRIGGER tr_DeleteUser2 AFTER DELETE
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
课堂案例2—使用PL/SQL管理触发器
案例完成步骤-创建触发器
添加标 【例2-4】通过临时表将Users表中删除的记录进行临时保存(行级触发器)。
(1)创建行级触发器的测试表 CREATE TABLE userdel
题文字
建议课时:8课时
2020/10/15 Or acle 数 据库 管理 与 应用 实例 教 程
9.1 触发器概述
触发器简介 触发器是一种特殊的存储过程,它与数据表紧密联系,用于保护表中的 数据,当一个定义了特定类型触发器的基表执行插入、修改或删除表中 数据的操作时,将自动触发触发器中定义的操作,以实现数据的一致性 和完整性。 触发器拥有比数据库本身标准的功能更精细和更复杂的数据控制能力。 触发器具有以下的作用: (1)在安全性方面,触发器可以基于数据库的值使用户具有操作数据 库的某种权利。 (2)在审计方面,触发器可以跟踪用户对数据库的操作。 (3)实现复杂的数据完整性规则。 (4)实现复杂的非标准的数据库相关完整性规则。触发器可以对数据 库中相关的表进行连环更新。 (5)同步实时地复制表中的数据。 (6)自动计算数据值,如果数据的值达到了一定的要求,则进行特定 的处理。例如,如果商品的数量低于5,则立即给管理人员发送库存报 警信息。

WHO VARCHAR2(30),

第5章_Oracle PL SQL语言及编程--包、触发器、同义词、序列

第5章_Oracle PL SQL语言及编程--包、触发器、同义词、序列

O r a c l e 数 据 库 与 应 用
删除包体和删除包 举例
例: DROP PACKAGE BODY EXPP; SELECT NAME FROM USER_SOURCE WHERE TYPE=‘PACKAGE’; --找到包EXPP DROP PACKAGE EXPP; --删除包EXPP
数据库管理
数据库应用
O r a c l e 数 据 库 与 应 用
本章学习要点
(1)PL/SQL的程序结构 (2) PL/SQL的字符集、标识符
(3) 数据类型、常量和变量
(4)结构控制语句 (5)游标的概念和使用 (6)过程的创建、调用和删除 (7)函数的创建、调用和删除 (8)包、触发器、同义词、序列的创建和使用
O r a c l e 数 据 库 与 应 用
5.6.2 创建触发器
触发器创建(权限:CREATE [ANY] TRIGGER),简化语法如下: CREATE [OR REPLACE] TRIGGER 触发器名 { BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF column [, column …]]} [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...] ON [schema.]表名| [schema.]视图 [FOR EACH ROW ] [WHEN condition] PL/SQL块 | CALL procedure_name;
第5章 Oracle PL/SQL语言及编程
本章 学习导航
闪回技术 Oracle 11g 安装与配置 数 据 库 应 用 程 序 开 发
高级管理
数据库备份与恢复 数据库存储管理 数据库安全管理 PL/SQL编程基础 视图和索引操作

oracle触发器insert写法

oracle触发器insert写法

Oracle触发器是一种数据库对象,它可以在数据库表上自动执行特定的操作。

在Oracle中,可以使用PL/SQL语言编写触发器。

以下是一个示例,演示如何在Oracle中编写一个INSERT触发器:
```sql
CREATE OR REPLACE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
-- 在这里编写触发器的逻辑
-- 例如,可以在这里对插入的数据进行验证或修改END;
/
```
在这个示例中,`trigger_name`是触发器的名称,`table_name`是要在其上应用触发器的表名。

`BEFORE INSERT`指定了触发器在插入操作之前执行。

`FOR EACH ROW`表示触发器将为每一行执行一次。

在触发器的主体部分(BEGIN和END之间),可以编写触发器的逻辑。

例如,可以使用PL/SQL语句对插入的数据进行验证或修改。

请注意,这只是一个示例,具体的触发器逻辑将取决于您的需求。

您需要编写适当的逻辑来满足您的应用程序的要求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle 第8章触发器、内置程序包1、技术目标∙应用触发器∙使用内置程序包2、什么是触发器∙触发器是当特定事件出现时自动执行的存储过程∙特定事件可以是执行更新的DML语句和DDL语句∙触发器不能被显式调用,存储过程可以显示调用触发器的功能有:∙自动生成数据∙自定义复杂的安全权限∙提供审计和日志记录∙启用复杂的业务逻辑触发器可以与特定的表或视图相关联,用于检查对表/视图所做的数据修改,当执行insert、delete、update语句时,可激活触发器代码3、如何创建触发器创建触发器的语法为:CREATE [OR REPLACE] TRIGGER trigger_name {AFTER | BEFORE | INSTEAD OF}{insert | delete | update [OF column[, column] ...]} [OR {insert | delete | update [OF column[, column] ...] }] ON[schema.]table_or_view_name[REFERENCING [NEW AS new_row_name] [OLD ASold_row_name]][FOR EACH ROW][WHEN (condition)][DECLAREvariable_declation]BEGINstatements;[EXCEPTIONexception_handlers]END [trigger_name];语法说明:AFTER | BEFORE,指在事件发生之前或之后激活触发器INSTEAD OF,表示可以执行触发器代码来代替导致触发器调用的事件insert | delete | update,指定构成触发器事件的数据操纵类型,update可指定列列表REFERENCING,指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLDtable_or_view_name,指要创建触发器的表或视图的名称FOR EACH ROW,指定是否对受影响的每行都执行触发器,即行级触发器,如不使用此句,则为语句级触发器WHEN,限制执行触发器的条件,该条件可包括新旧数据值的检查DECLARE...END,一个标准的PL/SQL块使用:在Emp表创建触发器,Sql代码1.CREATE OR REPLACE TRIGGER biu_emp_deptno2.--在添加或修改deptNo字段之前触发3.BEFORE INSERT OR UPDATE OF deptNo4.ON Emp5.--行级触发器6.FOR EACH ROW7.--列deptNo的新值不等于408.WHEN (New.deptNo <> 40)9.BEGIN10.--将comm列设置为011.:m := 0;12.END;13./注意:使用SHOW ERRORS命令可查看创建触发器时出现的错误4、触发器的组成部分触发器由以下3个部分组成:触发语句,定义激活触发器的DML 事件和DDL 事件,如:BEFORE INSERT OR UPDATE OF deptNoON Emp--行级触发器FOR EACH ROW这段代码表示,当对Emp表执行insert语句或对Emp表的deptNo列执行update语句时,触发器会在受影响的每一行上执行一次触发限制,执行触发器的条件,该条件必须为真才能激活触发器,如:--列deptNo的新值不等于40,触发器会执行WHEN (New.deptNo <> 40)触发操作,一些SQL 语句和代码,在发出了触发器语句且触发限制的值为真时运行,如:BEGIN--将comm列设置为0:m := 0;END;5、触发器的类型及使用触发器有如下的类型:每种触发器的作用:使用1:应用行级触发器,Sql代码1.--创建表TEST_TRG2.CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20));3.--创建序列SEQ_TEST4.CREATE SEQUENCE SEQ_TEST;5.--为TEST_TRG表创建行级触发器6.CREATE OR REPLACE TRIGGER BI_TEST_TRG7.--在insert(添加)或者update(修改)ID字段时触发8.BEFORE INSERT OR UPDATE OF ID9.ON TEST_TRG --指定TEST_TRG表10.FOR EACH ROW --设置为行级触发器11.--触发器语句部分12.BEGIN13.--判断是不是insert语句14.IF INSERTING THEN15.--如果是insert操作,将序列的值设置给ID列16.SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;17.ELSE18.--如果不是insert操作,不能修改ID列的值19.RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');20.END IF;21.END;22./注意:如果一个触发器由多种语句触发,可用INSERTING、UPDATING、DELETING这些关键字进行检查,对应语句类型使用2:应用语句级触发器,Sql代码1.CREATE OR REPLACE TRIGGER trgdemo2.AFTER INSERT OR UPDATE OR DELETE3.ON order_master4.BEGIN5.--根据语句类型输出信息6.IF UPDATING THEN7.DBMS_OUTPUT.PUT_LINE('已更新ORDER_MASTER中的数据');8.ELSIF DELETING THEN9.DBMS_OUTPUT.PUT_LINE('已删除ORDER_MASTER中的数据');10.ELSIF INSERTING THEN11.DBMS_OUTPUT.PUT_LINE('已在ORDER_MASTER中插入数据');12.END IF;13.END;14./注意:语句级触发器时CREATE TRIGGER命令所创建触发器的默认类型使用3:应用INSTEAD OF触发器,同时向两个表中插入值,Sql代码1.--创建视图2.CREATE VIEW ord_view AS3.SELECT order_master.orderno, order_master.ostatus,4.order_detail.qty_deld, order_detail.qty_ord5.FROM order_master, order_detail6.WHERE order_master.orderno = order_detail.orderno;7.8.--创建INSTEAD OF触发器9.CREATE OR REPLACE TRIGGER order_mast_insert10.INSTEAD OF UPDATE ON ord_view11.--为NEW关键字取别名n12.REFERENCING NEW AS n13.FOR EACH ROW14.DECLARE15.--定义游标,访问order_master表16.CURSOR ecur IS SELECT * FROM order_master17.WHERE order_master.orderno = :n.orderno;18.--定义游标,访问order_detail表19.CUSEOR dcur IS20.select * from order_detail21.WHERE order_detail.orderno = :n.orderno;22.--定义游标变量23.a ecur%ROWTYPE;24.b dcur%ROWTYPE;25.BEGIN26.--打开游标27.OPEN ecur;28.OPEN dcur;29.--读取行30.FETCH ecur into a;31.FETCH dcur into b;32.--判断是否有行33.IF dur%NOTFOUND THEN --没有34.--添加记录35.INSERT INTO order_master (orderno, ostatus)36.VALUES (:n.orderno, :n.ostatus);37.ELSE --有38.--修改记录39.UPDATE order_master SET order_master.ostatus = :n.ostatus40.WHERE order_master.orderno = :n.orderno;41.END IF;42.43.IF ecur%NOTFOUND THEN44.INSERT INTO order_detail (qty_ord, qty_deld, orderno)45.VALUES(:n.qty_ord, :n.qty_deld, :n.orderno);46.ELSE47.UPDATE order_detail SET48.order_detail.qty_ord = :n.qty_ord,49.order_detail.qty_deld = :n.qty_deld50.WHERE order_detail.orderno = :n.orderno;51.END IF;52.--关闭游标53.CLOSE ecur;54.CLOSE dcur;55.END;56./注意:使用INSTEAD OF触发器有如下的限制,∙只能在行级使用,不能在语句级使用∙只能应用于视图,不能应用于表使用4:应用模式(DDL)触发器,对用户删除的对象进行日志记录,创建模式触发器的语法为:CREATE OR REPLACE TRIGGER trigger_name {BEFORE | AFTER} trigger_eventON [schema.]SCHEMAWHEN (trigger_condition)trigger_body;Sql代码1.--创建日志记录表2.CREATE TABLE dropped_obj3.(4.obj_name VARCHAR2(30),5.obj_type VARCHAR2(20),6.drop_date DATE7.);8.--创建触发器9.CREATE OR REPLACE TRIGGER log_drop_obj10.--在执行drop语句后触发11.AFTER DROP ON SCHEMA12.BEGIN13.--将被删除对象的信息添加到日志记录表中14.INSERT INTO dropped_obj15.VALUES (ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE);16.END;17./使用5:应用数据库级触发器,在数据库启动后执行,CREATE OR REPLACE TRIGGER system_startup--系统启动时触发AFTER STARTUP ON DATEBASEBEGIN--加入所需代码END;/6、启动、禁用、删除触发器,查看触发器信息启用和禁用触发器:ALTER TRIGGER 触发器名DISABLE; --禁用ALTER TRIGGER 触发器名ENABLE; --启用删除触发器:DROP TRIGGER 触发器名;查看触发器信息,使用USER_TRIGGERS数据字典:使用1:查看为表EMP设置的触发器名select TRIGGER_NAME from USER_TRIGGERSWHERE TABLE_NAME = 'EMP';使用2:查看触发器BIU_EMP_DEPTNO的类型、触发事件、触发条件,select TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE from USER_TRIGGERSWHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';7、内置程序包Oracle提供了许多内置程序包,用于扩展数据库功能,数据库用户SYS 拥有所有程序包,程序包被定义为公有同义词,并将执行权限授予了PUBLIC用户组,任何用户都可访问,部分内置程序包如下:8、总结∙触发器是当特定事件出现时自动执行的存储过程∙触发器分为DML 触发器、DDL 触发器和数据库级触发器三种类型∙DML触发器的三种类型为行级触发器、语句级触发器和INSTEAD OF触发器∙了解一些常用的内置程序包。

相关文档
最新文档