PLSQL触发器详解-2
PLSQL基础(二)

PL/SQL Control Statements
IF THEN 语句 IF condition THEN statements END IF; IF THEN ELSE语句 IF condition THEN statements ELSE else_statements END IF; IF THEN ELSIF 语句 IF condition_1 THEN statements_1 ELSIF condition_2 THEN statements_2 END IF;
Collection Methods - 1
DELETE 删除集合中的所有元素 DELETE(n) 删除集合中的任意元素 n代表 着集合中的索引 DELETE(m,n) m,n代表着集合中的索引, 并且m<=n
TRIM 删除集合中的最末位的一个元素 TRIM(n) n代表着最末位的元素个数
Varrays (Variable-Size Arrays)
可变长度的数组的INDEX是从1开始起,到达该数组的元素个数 DECLARE TYPE TeamMembers IS VARRAY(4) OF VARCHAR2(15); myteam TeamMembers := TeamMembers(); BEGIN DBMS_OUTPUT.put_line(myteam.COUNT); myteam.EXTEND(3); DBMS_OUTPUT.put_line(myteam.COUNT); myteam(1) := 'Tom1'; myteam(2) := 'Tom2'; myteam(3) := 'Tom3'; FOR i IN myteam.FIRST .. ST LOOP DBMS_OUTPUT.put_line(myteam(i)); END LOOP; END;
oraclePLSQL编程语句之触发器

oraclePLSQL编程语句之触发器(本⽂章内容仅在windows10下经测试能够运⾏,不能保证其他环境下的可靠性)⽬录触发器的概念定义⼀个规则,在增删改操作时,只有满⾜规则,⾃动触发,⽆需调⽤。
触发器的分类1)语句级触发器:不包含for each row2)⾏级触发器:包含for each row使⽤for each row主要是为了使⽤:old和:new伪对象PL/SQL触发器语句即:old、:new伪对象的值详情参照下表:语句:old:newinsert空值插⼊的数据update修改前的数据修改后的数据delete删除前的数据空值语句级触发器的创建和使⽤语法:create [or replace] trigger 触发器名after/beforeinsert/update/delete on 表名declare定义变量begin触发器语句end 触发器名;使⽤语句级触发器实现:在person表插⼊⼀条记录后输出"⼀个新员⼯⼊职"⽰例代码如下:create or replace trigger t1after insert on persondeclarebegindbms_output.put_line('⼀个新员⼯⼊职');end t1;注意,在触发器语句的定义时,存在中⽂,可能会导致触发器创建后,伴随红叉,如不能解决中⽂问题,建议不使⽤中⽂。
⾏级触发器的创建和使⽤语法:create [or replace] trigger 触发器名before/afterinsert/update/deleteon 表名for each rowdeclare声明变量begin触发器语句(可以使⽤:old和:new)end 触发器名;使⽤⾏级触发器实现:在修改emp员⼯信息时,薪⽔下降时报错⽰例代码如下:create or replace trigger t2before update on empfor each rowdeclarebeginif :old.sal > :new.sal thenraise_application_error(-20001,'不能降薪');end if;end t2;注意:raise_application_error(number,varchar2);函数的第⼀个参数的范围为-20001~-20999使⽤触发器实现主键⾃增⽰例代码如下:--使⽤触发器实现主键⾃增create or replace trigger autoidbeforeinsert on personfor each rowdeclarebeginselect s_person.nextval into :new.pid from dual;end autoid;。
简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。
触发器可以用于在数据被插入、更新或删除时执行一系列的操作。
本文将详细介绍SQL触发器的使用和语法。
1.触发器的类型:SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。
根据业务需求选择相应的触发器类型。
2.创建触发器:创建触发器需要使用CREATETRIGGER语句。
语法如下:CREATE TRIGGER <trigger_name>{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[ON <table_name>][FOREACHROW][WHEN (<condition>)]BEGIN--触发器执行的操作END;其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。
3.触发器执行的操作:在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。
可以根据业务需求在触发器中编写逻辑代码来满足需求。
4.触发器的应用场景:-数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。
例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。
-数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。
例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。
sql触发器

sql触发器触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。
触发器主要是通过事件进⾏触发被⾃动调⽤执⾏的。
⽽存储过程可以通过存储过程的名称被调⽤。
Ø 什么是触发器触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。
触发器⼀般⽤在check约束更加复杂的约束上⾯。
触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。
诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。
SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。
DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。
⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。
既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插⼊表(instered表)和删除表(deleted表)。
这两张是逻辑表也是虚表。
有系统在内存中创建者两张表,不会存储在数据库中。
⽽且两张表的都是只读的,只能读取数据⽽不能修改数据。
这两张表的结果总是与被改触发器应⽤的表的结构相同。
当触发器完成⼯作后,这两张表就会被删除。
Inserted表的数据是插⼊或是修改后的数据,⽽deleted表的数据是更新前的或是删除的数据。
对表的操作Inserted逻辑表Deleted逻辑表增加记录(insert)存放增加的记录⽆删除记录(delete)⽆存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录Update数据的时候就是先删除表记录,然后增加⼀条记录。
plsql触发器写法

plsql触发器写法PL/SQL触发器是一种特殊的存储过程,它在数据库中的表上自动执行。
当在表上执行特定的操作时,触发器会自动触发并执行相应的代码。
下面是PL/SQL触发器的详细创作步骤:1. 创建触发器使用CREATE TRIGGER语句创建触发器。
语法如下:CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_name[FOR EACH ROW][WHEN condition]DECLARE-- 触发器代码BEGIN-- 触发器代码END;其中,trigger_name是触发器的名称,table_name是触发器所在的表名,BEFORE 或AFTER指定触发器在执行操作之前或之后执行,INSERT、UPDATE或DELETE 指定触发器在执行相应操作时触发,FOR EACH ROW指定触发器对每一行数据都执行,WHEN condition是可选的,用于指定触发器执行的条件。
2. 编写触发器代码在DECLARE和BEGIN-END之间编写触发器代码。
触发器代码可以包括PL/SQL语句、SQL语句和存储过程调用等。
例如,以下是一个简单的触发器代码,用于在插入数据时自动更新另一个表的数据:DECLAREv_count NUMBER;BEGINSELECT COUNT(*) INTO v_count FROM table_name;UPDATE other_table SET count = v_count;END;3. 测试触发器在表上执行相应的操作,触发器会自动执行相应的代码。
可以使用SELECT语句检查触发器是否按预期工作。
4. 修改或删除触发器可以使用ALTER TRIGGER语句修改触发器,使用DROP TRIGGER语句删除触发器。
例如,以下是修改触发器的语法:ALTER TRIGGER trigger_name{ENABLE | DISABLE};其中,ENABLE或DISABLE用于启用或禁用触发器。
Oracle数据库之PLSQL触发器

Oracle数据库之PLSQL触发器Oracle数据库之PL/SQL触发器1. 介绍触发器(trigger)是提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,⽐如当对⼀个表进⾏操作(insert,delete,update)时就会激活它执⾏。
触发器经常⽤于加强数据的完整性约束和业务规则等。
触发器有三种类型,分别是:DML触发器、替代触发器和系统触发器。
DML触发器顾名思义,DML触发器是由DML语句触发的。
例如数据库的INSERT、UPDATE、DELETE操作都可以触发该类型的触发器。
它们可以在这些语句之前或之后触发,或者在⾏级上触发(就是说对于每个受影响的⾏都触发⼀次)。
替代触发器替代触发器只能使⽤在视图上,与DML不同的是,DML触发器是运⾏在DML之外的,⽽替代触发器是代替激发它的DML语句运⾏。
替代触发器是⾏触发器。
系统触发器这种触发器是发⽣在如数据库启动或关闭等系统事件时,不是在执⾏DML语句时发⽣,当然也可以在DDL时触发。
触发器功能强⼤,轻松可靠地实现许多复杂的功能,但是我们也应该慎⽤。
为什么⼜要慎⽤呢?触发器本⾝没有过错,但如果我们滥⽤,会造成数据库及应⽤程序的维护困难。
在数据库操作中,我们可以通过关系、触发器、存储过程、应⽤程序等来实现数据操作,同时约束、缺省值也是保证数据完整性的重要保障。
如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。
2. 触发器组成触发器主要由以下⼏个要素组成:1. 触发事件:引起触发器被触发的事件。
2. 触发时间:触发器是在触发事件发⽣之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该触发器的操作顺序。
3. 触发操作:触发器被触发之后的⽬的和意图,是触发器本⾝要做的事情。
4. 触发对象:包括表、视图、模式、数据库。
Oracle_PLSQL_编程语法详解-触发器

第八章触发器触发器是许多关系数据库系统都提供的一项技术。
在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
§8.1 触发器类型触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。
即触发器是当某个事件发生时自动地隐式运行。
并且,触发器不能接收参数。
所以运行触发器就叫触发或点火(firing)。
ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。
ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
§8.1.1 DML触发器ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
§8.1.2 替代触发器由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。
所以给出了替代触发器。
它就是ORACLE 8专门为进行视图操作的一种处理方法。
§8.1.3 系统触发器ORACLE 8i 提供了第三种类型的触发器叫系统触发器。
它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
触发器组成:●触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。
●触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
●触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。
例如:PL/SQL 块。
●触发频率:说明触发器内定义的动作被执行的次数。
即语句级(STATEMENT)触发器和行级(ROW)触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
PLSQL触发器详解-2

executing temp_air
executing temp_air
SQL>
尽管第三个Insert语句是一条SQL语句,但插入TEMP表中两条记录。许多insert语句插入一条记录,但可以用一条语句插入许多行。
2、触发语句
比如:
表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
2、建立日志表
create table employees_log(
who varchar2(30),
when date);
3、在employees_copy表上建立语句触发器,在触发器中填充employees_log表。
Create or replace trigger biud_employee_copy
values( 12345,’Chen’,’Donny’, sysdate, 12,‘donny@’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。
referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new和old。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Trigger Body written PL/SQL
END;
·Trigger_name
用触发器名来确定表名和触发器类型。PL/SQL运行时错误将产生一个PL/SQL错误信息,涉及触发器名和行数。下面Oracle错误显示了在students表上的AFTER-INSERT行触发器的第5行有一个被0除错误。
values(12345,’Chen’,’Donny@hotmail’,sysdate,12);
select *from employees_log
总结:语句级触发器.(语句级触发器对每个DML语句执行一次)是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
触发器类型:
1、语句触发器
2、行触发器
3、INSTEAD OF触发器
4、系统条件触发器
5、用户事件触发器
注释:
before和after:指在事件发生之前或之后激活触发器。
instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。
insert、delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。
declare---end:是一个标准的PL/SQL块。
Oracle触发器详细介绍二--语句触发器
1、语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_mission_pct :=0;
例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number);
Create trigger biud_foo
Before insert or update or delete
On foo
Begin
If user not in (‘DONNY’) then
Raise_application_error(-20001,‘You don’t have access to modify this table.’);
End if;
End;
/
即使SYS,SYSTEM用户也不能修改foo表
[试验]
对修改表的时间、人物进行日志记录。
1、建立试验表
create table employees_copy as select * from hr.employees
2、行级触发器语法:
CREATE OR REPLACE TRIGGER trigger_name
AFTER|BEFORE INSERT|UPDATE|DELETE ON table_name
FOR EACH ROW
[WHEN (Boolean expression)]
DECLARE
Local declarations
referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new和old。
table_or_view_name:指要创建触发器的表或视图的名称。
for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。
when:限制执行触发器的条件,该条件可以包括新旧数据值得检查。
2、触发语句
比如:
表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
其中的new_value是代表更新之后的值。
4、触发操作
是触发器的主体
begin
:new_mission_pct :=0;
end;
主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
6 END;
7 /
8 SQL> INSERT INTO temp VALUES (1); -- insert 1 row
executing temp_air
SQL> INSERT INTO temp SELECT * FROM temp; -- insert 1 row
executing temp_air
Insert into employees_log(
Who,action,when)
Values( user, l_action,sysdate);
End;
/
3、测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
Oracle触发器详细介绍
Oracle触发器详细介绍一
触发器
是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
功能:
1、允许/限制对表的修改
2、自动生成派生列,比如自增字段
3、强制数据一致性
4、提供审计和日志记录
5、防止无效的事务处理
6、启用复杂的业务逻辑
开始
create trigger biufer_employees_department_id
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.STUDENTS_AIR", line 5
ORA-04088: error during execution of trigger
'SCOTT.STUDENTS_AIR'
行记数从关键字DECLARE行开始,如果没有DECLARE部分,BEGIN语句是第一行。触发器名称存储在USER_TRIGGERS表的TRIGGER_NAME。触发器名一般由表名、触发器类型、触发事件,语法如下:
实例:
create or replace trigger tri_test
after insert or update or delete on test
begin
if updating then
dbms_output.put_line('修改');
elsif deleting then
dbms_output.put_line('删除');
elsif deleting then
end if;
end;
if updating(‘COL1’) or updating(‘COL2’) then
------
end if;
[试验]
1、修改日志表
alter table employees_log
add (action varchar2(20));
2、修改触发器,以便记录语句类型。
SQL> INSERT INTO temp SELECT * FROM temp; -- inserts 2 rows
executing temp_air
executing temp_air
SQL>
尽管第三个Insert语句是一条SQL语句,但插入TEMP表中两条记录。许多insert语句插入一条记录,但可以用一条语句插入许多行。
说明:
1、无论是否规定了department_id,对employees表进行insert的时候
2、对employees表的department_id列进行update的时候
3、触发器限制
when (new_value.department_id<>80 )
限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
select * from employess_log;
5、确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING条件谓词,作判断:
begin
if inserting then
elsif updating then
end;
/
触发器的组成部分:
1、触发器名称
2、触发语句
3、触发器限制
4、触发操作
1、触发器名称
create trigger biufer_employees_department_id
命名习惯: