专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 简述PL/SQL触发器

简述PL/SQL触发器

更新时间:2021-03-15 17:55:44 来源:赢咖4 浏览655次

PL/SQL是Oracle数据库对SQL语句的扩展,触发器是由事件驱动的专用过程,由DBMS存储和管理。触发器是存储SQL过程的一种特殊形式,当发生诸如INSERT,DELETE或UPDATE之类的事件时,该触发器会启动一个操作或触发一个操作。PL/SQL触发器本身也可以包含INSERT,UPDATE和DELETE逻辑,因此,由于数据修改而触发触发器时,它还会引起另一次数据修改,从而触发另一个触发器。

一、PL/SQL触发器的创建:

1.标准触发器的创建

CREATE TRIGGER tirgger_name

BEFORE/AFTER DELETE[UPDATE INSERT SHUTDOWN]

ON object_name

trigger_sql_body;

Create trigger 表示创建触发器,随后是触发器的名字,before和after表示触发的时机,在之后是触发的事件如delete update等,使用on关键字说明触发器的操作对象,该对象可以是表或者数据库DATABASE,最后是触发器的主体代码逻辑。

实例:

CREATE TRIGGER delete_trigger--创建名为delete_trigger的触发器

BEFORE DELETE ON emp-- 之前操作,操作表emp

FOR EACH ROW --说明触发器对操作的涉及每一行都激发触发器行为

  BEGIN  

    dbms_output.put_line('触发器执行成功,正在删除');

  END;

2.创建基于JAVA的触发器:

创建触发器的执行部分使用java代码实现

public class  InsertTrigger

{

public static void insertDate() throws Exception

{

Connection conn = JDBCConnection.defaultConnection();

Statement stm = conn.CreateStatement();

stm.execute(" INSERT INTO table_name VALUES(ID1,ID2,'inserting') ");

stm.close();

return;

}

}

然后创建一个存储过程去包含java代码

CREATE OR REPLACE PROCEDURE record_insert_trigger() --过程创建

IS

 LANGUAGE JAVA --语言

 NAME 'InsertTrigger.insertDate()'--调用java类 类名.方法名

最后创建触发器调用

CREATE OR REPLACE TRIGGER record_insert_trigger_data

BEFORE INSERT ON emp

FOR EACH ROW

  BEGIN

    CALL record_insert_trigger();

  END;

 

二、PL/SQL触发器的分类

1.基于DML操作的触发器

  这类触发器是在当用户对一个表进行insert delete update 操作时触发行为的。

  在对表进行触发行为的时候使用for each row激发表中涉及的每行数据

 该类触发器语法:

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER INSERT[DELETE UPDATE ]

ON table_name

FOR EACH ROW[WHEN cond]

BEGIN sql_body END;

--这里需要说下[WHEN cond] 这个是限制条件,行级条件限制,当达到每种条件是在执行触发器举例说明

When(old.name in ‘hello world’)当oldname是 hello world是执行触发条件

2.基于DDL操作的触发器,语法

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER CREATE[DROP ALTER]--创建,删除修改

ON database_name [WHEN cond]

Sql_body;

此类触发器的典型应用,当创建修改删除数据库表的时候在之前或者之后记录该用户的操作信息,以作为用户操作日志。

3.基于数据库级操作的触发器

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER START[SHUTDOWM,LOGON,LOGOFF]--数据库、日志启动关闭

ON database_name [WHEN cond]

Sql_body;

 

三、PL/SQL触发器中的新值和旧值

创建基于DML的触发器时,由于操作对象是表,所以有一个可选项即for each row

以实现对每一行都激发触发器行为,Oracle提供2个临时表来访问每行中的新值和旧值即  :new 和 :old。下面举例说明下:

先创建update触发器

CREATE OR REPLACE TRIGGER update_trigger

AFTER UPDATE ON table_name

FOR EACH ROW

  BEGIN

    dbms_output.put_line('旧值:='||:OLD.CHARS);

    dbms_output.put_line('新值:='||:NEW.CHARS);

  END;

查询table_name表,查询结果

 

然后执行update操作

UPDATE table_name SET chars='newvalue';

查看输出日志

 

证明触发器执行成功,在查看table_name表数据已变更。

 综上所述,我们不难发现PL/SQL触发器和SQL触发器并没有太大的区别,都是用来监视某种情况,并触发某种操作。PL/SQL触发器是提供给程序员和数据分析员来保证Oracle数据库中数据完整性的一种方法,它是与表事件相关的特殊的存储过程。在本站的PL/SQL教程中对这一存储过程有着详细的描述,感兴趣的小伙伴可以前去观看学习。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>