ORACLE中触发器的判断IF语句

加一行 NULL 即可例如:SQL> DECLARE 2 testvalue INT; 3 BEGIN 4 testvalue := 200; 5 6 IF testvalue > 100 THEN 7 8 ELSIF testvalue = 100 THEN 9 dbms_output.put_line( '100' ); 10 ELSE 11 dbms_output.put_line( '100-' ); 12 END IF; 13 14 END; 15 / ELSIF testvalue = 100 THEN *ERROR 位于第 8 行:ORA-06550: 第 8 行, 第 9 列:PLS-00103: 出现符号 "TESTVALUE"在需要下列之一时::= . ( @% ;ORA-06550: 第 14 行, 第 4 列:PLS-00103: 出现符号 ";"在需要下列之一时:if上面的例子, 可以看出,如果 IF ELSE 里面, 没有内容, 那么编译不通过。

下面是 加一行 NULL 通过的例子:SQL> DECLARE 2 testvalue INT; 3 BEGIN 4 testvalue := 200; 5 6 IF testvalue > 100 THEN 7 NULL; 8 ELSIF testvalue = 100 THEN 9 dbms_output.put_line( '100' ); 10 ELSE 11 dbms_output.put_line( '100-' ); 12 END IF; 13 14 END; 15 /PL/SQL 过程已成功完成。

按照触发方式,oracle的触发器分为语句级和行级两种类型,在视图上

DML触发器有三类:1, insert触发器;2, update触发器;3, delete触发器;触发器的组成部分: 触发器的声明,指定触发器定时,事件,表名以类型 触发器的执行,PL/SQL块或对过程的调用 触发器的限制条件,通过where子句实现类型: 应用程序触发器,前台开发工具提供的; 数据库触发器,定义在数据库内部由某种条件引发;分为: DML触发器; 数据库级触发器; 替代触发器;DML触发器组件:1,触发器定时2,触发器事件3,表名4, 触发器类型5, When子句6, 触发器主体可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例创建DML触发器: Create [or replace] trigger [模式.]触发器名 Before| after insert|delete|(update of 列名)On 表名[for each row]When 条件PL/SQL块For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;Insert触发器的创建:create or replace trigger tg_insertbefore insert on studentbegin dbms_output.put_line('insert trigger is chufa le 。

..');end;/执行的效果:SQL> insert into student2 values(202,'dongqian','f');insert trigger is chufa le 。..update表级触发器的例子:create or replace trigger tg_updatestudentafter update on studentbegin dbms_output.put_line('update trigger is chufale 。

..');end;/运行效果:SQL> update student set se='f';update trigger is chufale 。..已更新8行;可见,表级触发器在更新了多行的情况下,只触发了一次;如果在after update on student后加上For each row的话就成为行级触发器,运行效果:SQL> update student set se='m';update trigger is chufale 。

..update trigger is chufale 。..update trigger is chufale 。

..update trigger is chufale 。..update trigger is chufale 。

..update trigger is chufale 。..update trigger is chufale 。

..update trigger is chufale 。..已更新8行;:new 与: old:必须是针对行级触发器的,也就是说要使用这两个变量的触发器一定有for each row这两个变量是系统自动提供的数组变量,:new用来记录新插入的值,old用来记录被删除的值;使用insert的时候只有:new里有值;使用delete的时候只有:old里有值;使用update的时候:new和:old里都有值;可以这样使用: dbms_output.put_line('insert trigger is chufa dbms_output.put_line('new id is : '||:new.stui dbms_output.put_line('new name is : '||:new.st dbms_output.put_line('new se is : '||:new.se);可以这样从数据字典中查看一个表上有哪几个触发器:SQL> select trigger_name from user_triggers2 where table_name=upper('student');TRIGGER_NAME------------------------------TG_INSERTTG_UPDATESTUDENT带有:old变量的行级delete触发器:create or replace trigger tg_deletestudentbefore delete on studentfor each rowbegin dbms_output.put_line('old is: '||:old.stuid); dbms_output.put_line('old name: '||:old.stuname);end;/运行效果:SQL> delete from student;old is: 202old name: dongqianold is: 101old name: liudehuaold is: 102old name: lingqingxiaold is: 103old name: lichanggongold is: 104old name: zhenxiuwenold is: 1001old name: lilianjieold is: 1009old name: tongleifuckold is: 203old name: kfdjold is: 209old name: fuck已删除9行When的使用:如果在begin也就是说触发器的PL/SQL主体块执行前加上when(old.se='f')的话,DML操作照做不误,但是只会在删除Se='f'的那行的时候才会执行触发器的主体动作,执行效果:SQL> delete from student;old is: 209old name: fuck已删除9行; 这里虽然删了9行,但是只执行了一次触发器的主体,做为一个行级触发器;混合类型触发器:Inserting,deleting,updating三个谓词可以分别指示当前操作到底是哪个;create or replace trigger hunhetriggerbefore insert or update or delete on studentfor each rowbegin if inserting then dbms_output.put_line('insert le。

'); end if; if deleting then dbms_output.put_line('delete le 。

.'); end if;end;/插入的时候就自动判断当前动作为插入:SQL> insert into student values(303,'me','f');insert le。

。删除的时候就自动判断当前动作为删除:SQL> delete from student;delete le 。

。.注意,既然触发器内部的主体PL/SQL是语句,那么它同样也可以是插入删除操作而不一定只是dbms_output打印一些信息;这正是日志表的原理:在用户执行了DML语句的时候触发主体为插入日志表以记录操作轨迹的触发器;为什么用触发器? 当我们有两个表用来记录商品的出库入库情况,good_store用来记录库存的产品类别和数量,而good_out用来记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在good_out中插入该产品的类别和出库数量,而同时也应该在good_store表中用update来更新库存的相应类别的产品。

ORACLE中触发器的判断IF语句

加一行 NULL 即可

例如:

SQL> DECLARE

2 testvalue INT;

3 BEGIN

4 testvalue := 200;

5

6 IF testvalue > 100 THEN

7

8 ELSIF testvalue = 100 THEN

9 dbms_output.put_line( '100' );

10 ELSE

11 dbms_output.put_line( '100-' );

12 END IF;

13

14 END;

15 /

ELSIF testvalue = 100 THEN

*

ERROR 位于第 8 行:

ORA-06550: 第 8 行, 第 9 列:

PLS-00103: 出现符号 "TESTVALUE"在需要下列之一时:

:= . ( @

% ;

ORA-06550: 第 14 行, 第 4 列:

PLS-00103: 出现符号 ";"在需要下列之一时:

if

上面的例子, 可以看出,如果 IF ELSE 里面, 没有内容, 那么编译不通过。

下面是 加一行 NULL 通过的例子:

SQL> DECLARE

2 testvalue INT;

3 BEGIN

4 testvalue := 200;

5

6 IF testvalue > 100 THEN

7 NULL;

8 ELSIF testvalue = 100 THEN

9 dbms_output.put_line( '100' );

10 ELSE

11 dbms_output.put_line( '100-' );

12 END IF;

13

14 END;

15 /

PL/SQL 过程已成功完成。

Oracle中触发器有几种,用法与SQL Server一样吗

ORACLE触发器有以下两类: 1 语句级(Statement-level)触发器,在CREATE TRIGGER语句中不包含FOR EACH ROW子句。

语句级触发器对于触发事件只能触发一次, 而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行 2 行级(Row-level)触发器,在CREATE TRIGGER语句中包含FOR EACH ROW子句。

行级触发器可对受触发器影响的每一行触发,并且能 够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。

SQL Server支持两种类型的触发器: AFTER 触发器和INSTEAD OF 触发器。其中AFTER 类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。

可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。

INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。

oracle 停止触发器语句,oracle触发器语句相关推荐

  1. oracle停止一切进程,oracle启动/停止的几种方法以及 启动和停止过程中出错的解决办法...

    一.启动几种方法: 1. sqlplus /nolog connect /as sysdba startup 2. sqlplus /nolog connect /as sysdba startup ...

  2. oracle停止一切进程,oracle中expdp/impdp进程如何停止

    微信公众号:51码农网 专业编程问答社区 www.51manong.com 数据泵窗口CTRL+C后,进程一直还在.dmp文件还在增加.DATAPUMP进程是后台进程,前台CTRL+C是无法终止. 1 ...

  3. oracle创建主键sql语句,Oracle创建主键自增表(sql语句实现)及触发器应用

    Oracle创建主键自增表(sql语句实现)及触发器应用 1.创建表 复制代码 代码如下: createtableTest_Increase( useridnumber(10)NOTNULLprima ...

  4. oracle 触发器执行ddl,在Oracle的触发器中执行DDL语句

    触发器无需commit 也不能写commit 触发器和触发它的DML是同一个事务 DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT 那就用自治事务 相当 ...

  5. oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?

    从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE).这些系统级别的触发器包括数据库启动触发器 ...

  6. oracle dml触发器 获取当前执行sql语句,Oracle DML触发器

    DML触发器的要点 DML触发器是定义在表上的触发器,由DML事件引发.编写DML触发器的要素是: * 确定触发的表,即在其上定义触发器的表. * 确定触发的事件,DML触发器的触发事件有INSERT ...

  7. oracle 创建触发器_oracle创建触发器

    创建触发器 创建触发器的一般语法是: CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPD ...

  8. mysql触发器和oracle,MySQL与Oracle 差异比较之六触发器

    MySQL与Oracle 差异比较之六触发器 触发器 编号 类别 ORACLE MYSQL 注释 1 创建触发器语句不同 create or replace trigger TG_ES_FAC_UNI ...

  9. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

    WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

最新文章

  1. Splay ---- 文艺平衡树区间翻转的建树模式
  2. python中str的索引、切片
  3. Gradle 配置spring boot启动
  4. Mybatis学习之配置优化
  5. 浅谈python异步IO,同步IO,线程与进程~
  6. CString与std::string unicode下相互转化
  7. 026-微软Ajax异步组件
  8. html div float center,跨浏览器实现float:center
  9. C++类型萃取之type_traits和type_info
  10. Asp.Net Mvc表单提交之List集合
  11. [BZOJ 3531] [Sdoi2014] 旅行 【离线+LCT】
  12. c语言 long 用法,C语言中long long的用法
  13. Python: 序列list:保持元素顺序同时消除重复值
  14. Flutter功能 中ListView和GridView嵌套报错?【教你一步搞定】
  15. spring4.1.8扩展实战之七:控制bean(BeanPostProcessor接口)
  16. 紫书刷题记录 UVa1593 代码对齐
  17. CMYK与有什么RGB区别?
  18. 揭密备份恢复的原理!
  19. JDBC从入门到精通
  20. 短网址短链接哪个好用?2021年最好的缩短链接短网址推荐

热门文章

  1. 介绍电子标签芯片的组成及功能
  2. 关于 print 和 printf:
  3. 基于MATLAB机器视觉的水果分级检测系统的设计
  4. Arduino-TB6600驱动42步进电机
  5. 如何无损压缩证件照?有没有免费的方法
  6. node爬虫进阶之——登录
  7. Centos7 修改系统时区(显示北京时间)
  8. 2021 华中科技大学软件学院软件体系结构考试题回忆
  9. Mac下解决以太网不是en0的问题
  10. 【学习之远程仓库上传】 (master|REBASE 1/2)怎么变成 (master)