ORACLE触发器中如何终止SQL语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE触发器中如何终止SQL语句相关的知识,希望对你有一定的参考价值。

就是当我向表中插入一条数据 如果 时间在 22:00---00:00就不可以插入数据 用ORACLE 触发器怎么实现

create or replace trigger insert_stopbefore insert on tb --tb为你的表名for each rowdeclare insert_excp exception; v_tm varchar2(4);begin v_tm := to_char(sysdate,\'hh24mi\'); if (to_number(v_tm)>=2200 and to_number(v_tm)<=2359) or v_tm=\'0000\' then raise insert_excp; end if;exception when insert_excp then dbms_output.put_line(\'在22:00---00:00不可以插入数据\'); when others then dbms_output.put_line(sqlcode || \': \'||sqlerrm);end; 参考技术A 设置时间 到那个时间自动就不执行sql了。就不插了

pl/sql--触发器 Triggers

一:触发器简介

pl/sql--触发器 Triggers

  Oracle 可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对各个行或者语句操作上进行触发.

1.替代触发器

  由于在Oracle里,不能直接对由两个以上的表建立的视图进行操作,所以给出了替代触发器。

2.系统触发器

  他可以在Oracle数据库系统中的时间中进行触发,如Oracle系统的启动与关闭等。

 

触发器组成:

  • 触发事件:即在何种情况下触发Trigger;例如: insert,update,delete。
  • 触发时间即在Trigger是在触发时间发生之前(before)还是之后(after)触发,也就是触发事件和该trigger的操作顺序。
  • 触发器本身:即该trigger被触发后的目的和意图,正是触发器本身要做的事情。例如:pl/sql块。
  • 触发频率:说明触发器内定义的动作被执行的次数。即语句级(statement)触发器和行级(row)触发器

    语句级(statement)触发器:是指当某触发事件发生时,该触发器只执行一次。

    行级(row):是指当某触发时间发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。

 

二:trigger 实验

1.helloworld trigger  后期用plsq工具创建更加简单

一个helloworld级别的触发器
create or replace trigger hello_trigger
after 
update on employees
--for each row
begin 
    dbms_output.put_line(hello...);
    --dbms_output.put_line(‘old.salary:‘|| :OLD.salary||‘,new.salary‘||:NEW.salary);
end;
然后执行:
update employees set salary = salary + 1000 where employee_id=100

2.行级触发器: for each row  每更新 employees 表中的一条记录, 都会导致触发器执行

create or replace trigger employees_trigger
after 
update on employees
for each row
begin
       dbms_output.put_line(修改了一条记录!);
end;

3.语句级触发器: 一个 update/delete/insert 语句只使触发器执行一次

create or replace trigger employees_trigger
after 
update on employees
begin
       dbms_output.put_line(修改了一条记录!);
end;

4.使用 :new, :old 修饰符 

   :old    触发器触发之前的数据

   :new  触发器触发之后的数据

create or replace trigger employees_trigger
after 
update on employees
for each row
begin
       dbms_output.put_line(old salary:  || :old.salary || , new salary:  || :new.salary);
end;

5.综合例子:编写一个触发器, 在对 my_emp 记录进行删除的时候, 在 my_emp_bak 表中备份对应的记录

1). 准备工作:
    create table my_emp as select employee_id id, last_name name, salary sal from employees
    create table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 2

2). 
create or replace trigger bak_emp_trigger
       before delete on my_emp
       for each row
       
begin
       insert into my_emp_bak values(:old.id, :old.name, :old.sal);
end; 

 

 

 

 

 

 

 

 

 

 

以上是关于ORACLE触发器中如何终止SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle触发器中如何执行多条update语句?

Oracle 终止会话过程

如果触发器中的语句不起作用 SQL(Oracle)

基本 Oracle 触发器审计表

oracle update触发器如何获取被修改的字段

oracle sql语句