包子的 oracle 学习笔记---触发器
来源:互联网 发布:java map用法 编辑:程序博客网 时间:2024/04/29 13:00
ORACLE学习
目录
- ORACLE学习
- 目录
- 触发器
- 触发器的定义
- 数据操纵语言DML的触发器
- DML触发器创建
- DML触发器的隐藏变量
- 触发器中声明变量以及使用
- 触发器的事务处理
- 触发器的异常处理
触发器
触发器的定义.
触发器 Trigger 作用是监听数据库.
可以监听的事件有三大类
1.数据库事件,监听整个数据库的事件.
STARTUP 数据库启动时触发 SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发 . LOGON 当用户连接到数据库会话时触发. LOGOFF 当用户断开数据库会话时触发. SERVERERROR 当数据库发生异常时触发.
2.数据库模式定义语言DDL(Data Definition Language)事件,监听数据库对象的事件
CREATE 在创建新对象时触发. ALTER 修改数据库或数据库对象时触发. DROP 删除对象时触发.
3.数据操纵语言(DML)事件,监听数据库表或视图的事件
INSERT 在表或视图中插入数据时触发. UPDATE 修改表或视图中的数据时触发. DELETE 在删除表或视图中的数据时触发.
数据操纵语言(DML)的触发器
DML触发器创建
select; /*这行无用.仅为了使文本变色*/create or replace trigger texttext 为触发器名称 before insert or update or delete -- 触发时间 空格 触发事件 -- 触发时间为如下3种. -- before 在语句执行前触发.晚于约束. -- after 在语句执行结束后触发.晚于约束 -- instead of 在语句执行前触发.早于约束. instead of 可用来做详细约束处理. -- 触发事件为如下5种. -- insert 增加数据时触发 -- update 修改数据时触发 update of 列名 可以指定哪些列变化时触发. -- delete 删除数据时触发 -- insert or update 增加或修改数据时触发 -- insert or update or delete 增加或修改或删除数据时触发 on textTable --触发器监听的表或视图 for each row -- 触发器执行方式 -- for each statement 语句级触发器.一次访问算一次无论修改多少条数据. -- for each row 行级触发器.修改多少条数据触发多少次.declare -- local variables here --触发器变量与游标声明位置begin --触发器方法体执行位置end text;--触发器名称
因为一个表或视图可以绑定多个触发器.所以触发器之间执行是有先后顺序的.
语句级触发器 > 行级触发器
instead of > before > after
instead of 触发时间的触发器一种事件只能创建一个,before 与 after 可以创建多个.
DML触发器的隐藏变量
INSERTING DELETING UPDATING
在IF 语句中使用.可以用来判断当前执行的是什么.
语法:
IF INSERTING THEN --方法体ELSEIF DELETING THEN --方法体ELSE --方法体END IF;
获取数据变量 :OLD 与 :NEW
用来获取触发器触发时变量.
其中 INSERT时 只有 :NEW ;
DELETE 时 只有 :OLD ;
UPDATE 时 有:OLD :NEW
语法:
:NEW.列名
触发器中声明变量以及使用
1.变量的声明 赋值 与使用.
变量的声明是在 declare 中声明.使用则在 begin 中.
赋值可以在任意位置赋值.
语法:
declare--变量声明.test varchar2(10); --变量名 变量类型testId number(1);testvalue varchar(20);begin--变量赋值test := 值;select id,valeu into testId,testvalue from 表 where 1 = 1--可以直接查询并赋值.--变量使用testtestId testvalueend;
2.游标声明与使用.
游标的声明是在 declare 中声明.使用则在 begin 中.
游标的使用方式2种
一for循环遍历获取.
二 使用OPEN打开游标获取其中一条.
需要注意的是.游标在自定义事物下无法获取数据.
语法:
declare CURSOR testdate is --testdate 游标名 select * from 表 where 1 = 1;--游标查询数据sql语句 testrow testdate%rowtype; --声明一个变量testrow 定义为游标testdate类型begin--第一种方式. FOR testrow IN testdate LOOP --每次循环将数据从游标中提取一行放入到变量里 IF testdate%FOUND THEN --判断有数据为true testrow.ID --变量可以直接获取对应的列 END IF; END LOOP;--第二种方式. OPEN testdate; --打开这个游标 FETCH testdate --获取其中一行数据放入变量中 INTO testrow; IF testdate%NOTFOUND THEN --判断没有数据时为true testrow.ID --变量可以直接获取对应的列 END IF; CLOSE testdate;end;
触发器的事务处理.
通常情况下触发器的事物是与监听的表共用同一个事物.
当触发器中出现错误.将会回滚触发器以及触发事件的表.
因为触发器与表共用同一个事物.所以在触发器中不能对本表(触发事件的表)进行操作.
但此时想查询本表数据的话.就用到了自定义事物(不推荐使用.建议更改设计)
自定义事物.
在触发器中想对本表进行查询时使用.
语法:
declare --在 declare 中进行定义.PRAGMA AUTONOMOUS_TRANSACTION;begin--方法体COMMIT;end;
触发器的异常处理
当触发器出现异常时.通过EXCEPTION可以获取到出现异常的类型
并且可以打印到控制台异常出现时的信息.
EXCEPTION WHEN no_data_found THEN dbms_output.put_line(错误的数据);--在控制台打印消息 WHEN OTHERS THEN dbms_output.put_line();
触发器中还有很多我不会的.需要学习的. ><”
- 包子的 oracle 学习笔记---触发器
- 包子的 oracle 学习笔记---SQL学习
- 包子的 oracle 学习笔记---创建数据库
- 包子的 oracle 学习笔记---ORA异常原因与解决办法
- Oracle的触发器学习笔记
- Oracle 学习笔记 触发器
- oracle 触发器学习笔记
- Oracle触发器学习笔记
- oracle 触发器 学习笔记
- oracle触发器学习笔记
- oracle学习笔记_触发器
- oracle学习笔记_触发器
- oracle学习笔记_触发器
- oracle学习笔记_触发器
- oracle学习笔记_触发器
- oracle学习笔记_触发器
- oracle学习笔记_触发器
- oracle学习笔记_触发器
- e洗车濒临倒闭,汽车后市场O2O还有戏吗?
- 【解决】安装CDH需关闭SELinux的问题
- mongodb Cloud Manager (原mongodb mms) 监控代理安装设置图文教程 2016-11-23修订
- Apple TV 人机界面指南
- IOS 网络请求框架封装
- 包子的 oracle 学习笔记---触发器
- 关于逗号运算符
- 【Android 开发】:数据存储之File文件存储 [即SD卡的写入与读取]
- 设备的兼容性(Device Compatibility)
- JAVA获取中文名字的首字母,如:"阿鲁卓玛",获取的首字母是"alzm"
- 模板
- Hive JDBC 连接
- Intentservice is way better than service
- centos 如何改主机名