(1)触发器有哪些限制
(2)触发器的事务控制是怎样的?
(3)触发器失败时,外部SQL是否会返回错误;如果会,则研究如何不返回错,如果不会,则研究如何会返回错误;
(
答:
(1)在Oracle中,对触发器的限制是:
1、触发器不接受参数。
2、一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。
3、触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。
4、在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)
5、触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。
6、 在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。
7、在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能指向表中的任何long和blob列
(2)在Oracle中,触发器的事务控制是:
1。触发器与触发该触发器的SQL语句同属于一个事务,它只能随着外部SQL语句事务的提交、回滚而提交、回滚。(但在oracle8i 以及更高的版本中,你可以创建作为自治事务而执行的触发器,在这种情况下,触发器可以做提交或回滚操作,而与触发该触发器的外部SQL所在的事务无关)
(3)触发器失败时,控制外部SQL是否会返回错误:
1、如需外部SQL返回错误信息,触发器不对exception,进行捕捉,或者捕捉后再RAISE错误信息。
2、如不需外部SQL知道触发器是否失败,捕捉exception,不对外RAISE。
触发器语法
CREATE [OR REPLACE] TIGGER 触发器名
[before|after] --触发时间
[insert|update|delete] --触发事件
OF 列名
ON 表名
[FOR EACH ROW]
DECLARE
//定义变量
BEGIN
// pl/sql语句
EXCEPTION
//异常处理
WHEN OTHERS THEN
RAISE; //抛出异常给外部SQL
END;