- 浏览: 246265 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
3w1h:
"2.对于外部查询中的每一行分别执行一次子查询,而且 ...
浅说:in、not in、exists和not exists的区别 -
danielhjd:
shishuang 写道[size=large][/size] ...
(SSH框架)Spring 和Struts的配置说明... -
shishuang:
[size=large][/size] 没有出来你strut ...
(SSH框架)Spring 和Struts的配置说明... -
daven1314:
不错,学习了!
(oracle)如何创建和使用procedure
定义:instead of
1) 基于view表单的处理可以在表和视图上指定一个instead of 触发器
2) 执行这种触发器可以代替原来的触发器,instead of 触发器扩展了视图跟新类型
3) 每一个表和视图只能有一个instead of 触发器
4) INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图
5) INSTEAD OF触发器的主要优点就是可以使不能更新的视图支持更新。基于多个表的视图必须使用。
6) INSTEAD OF触发器来支持多个表中数据的插入、更新和删除操作。
注:不能在带有with check option 定义的视图中创建INSTEAD OF触发器
第一:instead of 触发器:
a: 有关insert的触发时间的触发器
--step 1 create referenced table
create table stu( stu_id number(9) primary key, stu_name varchar2(25) ) create table course( c_id number(9) primary key, grade varchar2(25), foreign key (c_id) references stu(stu_id) )
--step 2 create a view
create view sc_view as select stu.stu_id,stu.stu_name,course.grade from stu,course where stu.stu_id=course.c_id
测试:testing insert one statement
insert into sc_view values(5,'lily','75');
结果:result:
--step3 create a trigger
create or replace trigger tri_sc_view instead of insert on sc_view begin insert into stu values(:new.stu_id,:new.stu_name); insert into course values(:new.stu_id,:new.grade); end;
提示:很多人纠结为什么 插入 stu & course表中的:new.stu_id是一样了?其实new.stu_id只是一个数值而已,那这句语句分析insert into sc_view values(5,'lily','75'); :new.new.stu_id 就是5,:new.stu_name就是‘lily’,:new.grade就是‘75’。他们的产生是根据创建的视图表sc_view的到的。触发器的执行过程是,先遇到触发事件这里指:insert into sc_view values(5,'lily','75'); 然后产生想对应的:new.stu_id ,:new.stu_name,:new.grade。将这些值赋值给了触发器作用的表单;
执行语句:
1)
insert into sc_view values(1,'justin','88'); insert into sc_view values(2,'irs','70'); insert into sc_view values(3,'danile,'90); insert into sc_view values(4,'tina,'75'); insert into sc_view values(5,'lily','75');
结果:
select * from sc_view
select * from stu
select * from course
创建了view的trigger以后,可以直接通过添加wiew表单的数据来实现其他关联表的处理。。
2)
insert into stu values(6,'eric');
insert into course values(6,'95');
结果:
实际上是一起跟新的...
b)有关更新update的触发器;
select * from employees create sequence empl_seq; alter table employees drop(job_id,manger_id,department_id,dn) insert into employees values(empl_seq.nextval,'daniel','hwong','daniel@yahoo.com','15902701688',sysdate,2000,.12); insert into employees values(empl_seq.nextval,'justin','williams','justin@yahoo.com','15902701114',sysdate,5000,.12); create or replace view tt_view as select employees.first_name||','||employees.last_name v_name,employees.email,employees.phone_no,employees.employee_id from employees select * from tt_view update tt_view set v_name='justin2,william2'where employee_id=2 --执行弹出 oracl-01733此处不允许修改虚拟值-- create or replace trigger tri_employ instead of update on tt_view begin update employees set employees.first_name=substr(:new.v_name,instr(:new.v_name,',')+1), employees.last_name=substr(:new.v_name,1,instr(:new.v_name,',')-1), employees.phone_no=:new.phone_no, employees.email=:new.email where employees.employee_id=:new.employee_id; end;
第二:用户事件触发器;
create trigger ad_startup after startup on database begin -- do some stuff end;
第三:系统触发器;
-----用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE /
RENAME / TRUNCATE / LOGOFF
create table droped_objects( object_name varchar2(30), object_type varchar2(30), dropped_on date);
create or replace trigger log_drop_trigger before drop on donny.schema begin insert into droped_objects values( ora_dict_obj_name, -- 与触发器相关的函数 ora_dict_obj_type, sysdate); end;
create table drop_me(a number); create view drop_me_view as select *from drop_me; drop view drop_me_view; drop table drop_me; select *from droped_objects
禁用和启用触发器
alter trigger <trigger_name> disable;
alter trigger <trigger_name> enable;
事务处理:
在触发器中,不能使用commit / rollback
因为ddl语句具有隐式的commit,所以也不允许使用
发表评论
-
Oracle中有关Group by 中avg();sum();min();max();count();的运用整理(Oracle的执行顺序)
2011-06-15 18:11 29398表 tabzx: select * from tabzx ... -
(Oracle) Oracle入门基础理论
2011-06-08 19:29 11889一:Oracle的概述 什么 ... -
(Index)Oracle 中Index的运行机制
2011-06-01 12:12 7010从表单访问数据时,Orac ... -
(数据库范式) 第一范式(1NF);第二范式(2NF);第三范式(3NF)
2011-05-30 10:22 1355第一范式(1NF)Unique Columns 无重复的列 ... -
浅说:in、not in、exists和not exists的区别
2011-05-29 15:08 1779in、not in、exists和not exists的区别: ... -
(笔记)oracle中的join的整理和结构分析
2011-05-29 13:56 22151在Oracle中的join主要分为:外连接(outter jo ... -
(笔记)Oracle中的批量删除数据
2011-05-27 12:03 2363在一个ORACLE数据库 ... -
(trigger)触发器的定义和作用
2011-05-25 16:00 17838第一:触发器(trigger) 触发器(trigger)是指 ... -
Oracle中的loop循环的例子
2011-05-25 15:07 28446第一:loop... exit when...end loop ... -
(oracle)如何通过函数去调用procedure的注意事项
2011-05-25 12:06 1671创建一个带参数的procedure temp_pr(): c ... -
在oracle中创建一个exception
2011-05-24 19:24 865Gramma: 1:声明一个exceptin: d ... -
(oracle)如何创建和使用procedure
2011-05-24 18:44 30621:定义procedure(在高级 ... -
(笔记)如何声明使用cursor及其属性
2011-05-24 14:55 2397Defined cursor ; cursor mycurs ... -
(游标)How to define and implement THE CURSOR--2
2011-05-24 11:33 1--定义游标-- declare tempsal empl ... -
(游标)How to define and implement THE CURSOR
2011-05-24 11:29 991Definition: cursor的作用是从数据表中提取来 ... -
(cursor)How to define and implement THE CURSOR
2011-05-24 11:24 1Definition: cursor的作用是从数据表中提取来 ... -
(savepoint) savepoint--rollback
2011-05-24 10:38 1112语法: savepoint 保存点的名称; roll ... -
(笔记)Oracle中的表达式
2011-05-23 16:44 1210(1)数值表达式--+(加法),-(减法),*(乘法),/(除 ... -
(笔记)基本复合型数据类型的声明
2011-05-23 16:16 1083--(1)使用%type定义变量 -- declare n ... -
复杂的Oracle的查询--查询各个部门的总员工和总薪水占整个公司的比率
2011-05-20 16:56 2191查询各个部门的总员工和总薪水占整个公司的比率: SEL ...
相关推荐
触发器---FOR INSERT与INSTEAD OF 触发器是一种特殊的存储过程,它可以自动执行某些操作以响应特定的事件,如INSERT、UPDATE、DELETE等。触发器可以帮助我们自动执行一些必要的操作,以确保数据的一致性和完整性。...
Oracle触发器是数据库管理系统Oracle中的一个重要特性,它允许开发者在特定的数据操作语言(DML)事件发生时自动执行预定义的PL/SQL代码。触发器主要用于实现数据的完整性、一致性控制,以及执行复杂的业务规则。...
触发器与存储过程和函数类似,都是存储在数据库中的程序单元,但触发器的独特之处在于它们不是由用户直接调用,而是由数据库操作(如INSERT、UPDATE、DELETE)或其他系统事件触发执行。 8.1 触发器类型分为三类: ...
3. **系统触发器**:这些触发器在特定的系统事件发生时触发,如数据库启动、用户登录或表空间更改。它们不直接与DML操作关联,但可以用于实现更高级别的数据库管理和监控功能。 **创建触发器的语法:** ```sql ...
5. **系统触发器和用户事件触发器** - **系统触发器**是由数据库系统在特定系统事件(如数据库启动、关闭等)发生时触发的。 - **用户事件触发器**是用户定义的,响应特定的用户操作(如DML操作)而触发。 6. **...
1. 触发器的创建和使用:在SQL Server中,可以通过使用CREATE TRIGGER语句创建触发器,并通过指定INSTEAD OF子句来指定触发器应该在哪些操作上触发。例如,“CREATE TRIGGER de_em_insert ON v INSTEAD OF INSERT AS...
- **系统触发器事件属性**:理解和设置触发器关联的系统事件属性,以精确控制触发时机。 - **使用触发器谓词**:通过WHEN子句指定触发条件,只有满足条件时触发器才会执行。 - **重新编译触发器**:当触发器的依赖...
- INSTEAD-OF触发器:在DML语句(INSERT, UPDATE, DELETE)执行前触发,可以替代默认的操作。如果定义了INSTEAD-OF触发器,那么对应的DML语句将不直接作用于数据,而是由触发器中的代码处理。 - AFTER触发器:在...
3. INSTEAD OF 触发器:例如create trigger instead_of_update on view_name for update 4. 系统条件触发器:例如create trigger system_trigger on database 5. 用户事件触发器:例如create trigger user_trigger ...
- **系统和用户数据库事件**:例如用户的登录与注销、数据库的打开与关闭以及特定错误消息等。 #### 4. 触发器类型 触发器按照触发事件类型和对象的不同,可以分为多种类型: - **DML触发器**:依赖于DML操作触发...
触发器是数据库管理系统(DBMS)中的一个重要功能,主要用于在特定的数据更改事件发生时自动执行预定义的操作。这些事件包括插入(new row)、删除(old row)或更新(row changes)等。触发器能够帮助确保数据的完整性和...
- INSTEAD OF触发器:在DML操作执行前触发,可以替代默认的操作行为,如果在触发器中没有执行相应的DML操作,则实际的数据修改不会发生。 3. **触发器的嵌套与递归** - 嵌套触发器:一个触发器可以触发另一个...
INSTEAD OF触发器会在触发事件发生之前执行,它通常用于替代原有的插入、更新或删除操作。AFTER触发器则在触发事件发生之后执行,用于在操作之后执行一些额外的逻辑。 3. 触发器创建语法:创建触发器的基本语法结构...
2. INSTEAD OF 触发器:执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。 3. FOR 触发器:相当于 AFTER 触发器,但可以选择是否指定触发器所有者名称。 三、触发器的执行顺序 触发器的执行顺序如下所...
- **INSTEAD OF触发器**:替代DML操作,而不是在操作后响应,主要用于视图。 - **系统条件触发器**:响应特定的系统事件,如数据库启动或关闭。 - **用户事件触发器**:响应用户定义的事件,实现定制化的数据库...
SQL触发器是数据库管理系统中的一种特殊程序,它们在特定的数据操作事件发生时自动执行,以响应用户的INSERT、UPDATE或DELETE操作。触发器主要用于维护数据的完整性和一致性,确保数据库中的数据按照预设的规则进行...
系统触发器是Oracle自动创建并触发的,它们响应数据库级别的事件,如数据库启动、用户登录、表空间变更等。 10.5 用户事件触发器 用户事件触发器是用户定义的,用于响应特定的用户定义事件,比如用户定义的存储过程...