- 浏览: 246340 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
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
触发器
是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
Instance:
create trigger biufer_employees_department_id
before insert or update of department_id
on employees
referencing
old as old_value
new as new_value for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
触发器的组成部分:
1、 触发器名称
2、 触发语句
3、 触发器限制
4、 触发操作
1、 触发器名称(Given Name)
create trigger [Trigger Name]
2、 触发语句
before/after insert or update of [Columns Name||department_id]
on [Table Name||employees]
referencing old as old_value
new as new_value
for each row
表或视图上的DML语句 DDL语句 数据库关闭或启动,startup shutdown 等等
说明:
1、 无论是否规定了department_id ,对employees表进行insert的时候
2、 对employees表的department_id列进行update的时候
3、 触发器限制
when (new_value.department_id<>80 )限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。其中的new_value是代表跟新之后的值。
4、 触发操作
是触发器的主体
begin
:new_value.commission_pct :=0;
end;
主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。
触发器类型:
1、 语句触发器
2、 行触发器
3、 INSTEAD OF 触发器
4、 系统条件触发器
5、 用户事件触发器
1、 语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、
DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次
。比如,无论update多少行,也只会调用一次update语句触发器。
例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number);
Create trigger biud_foo
Before insert or update or delete
On foo
Begin
If user not in (‘DONNY’) then
Raise_application_error(-20001, ‘You don’t have access to modify this table.’);
End if;
End;
/
即使SYS,SYSTEM用户也不能修改foo表
[试验]
对修改表的时间、人物进行日志记录。
1、 建立试验表
create table employees_copy as select *from hr.employees
2、 建立日志表
create table employees_log(
who varchar2(30),
when date);
3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger biud_employee_copy
Before insert or update or delete
On employees_copy
Begin
Insert into employees_log(
Who,when)
Values( user, sysdate);
End;
/
4、 测试
update employees_copy set salary= salary*1.1;
select *from employess_log;
5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判断:
begin
if inserting then
-----
elsif updating then
-----
elsif deleting then
------
end if;
end;
if updating(‘COL1’) or updating(‘COL2’) then
------
end if;
[试验]
1、 修改日志表
alter table employees_log
add (action varchar2(20));
2、 修改触发器,以便记录语句类型。
Create or replace trigger biud_employee_copy
Before insert or update or delete
On employees_copy
Declare
L_action employees_log.action%type;
Begin
if inserting then
l_action:=’Insert’;
elsif updating then
l_action:=’Update’;
elsif deleting then
l_action:=’Delete’;
else
raise_application_error(-20001,’You should never ever get this error.’);
Insert into employees_log(
Who,action,when)
Values( user, l_action,sysdate);
End;
/
3、 测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
values(12345,’Chen’,’Donny@hotmail’,sysdate,12);
select *from employees_log
update employees_copy set salary=50000 where employee_id = 12345;
2、 行触发器
是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:
1、 定义语句中包含FOR EACH ROW子句
2、 在BEFORE……FOR EACH ROW触发器中,用户可以引用受到影响的行值。
比如:
定义:
create trigger biufer_employees_department_id
before insert or update
of department_id
on employees_copy
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/
Referencing 子句:
执行DML语句之前的值的默认名称是ld ,之后的值是 :new
insert 操作只有:new
delete 操作只有ld
update 操作两者都有
referencing子句只是将new 和old重命名为new_value和old_value,目的是避免混淆。比如操作一个名为
new的表时。
作用不很大。
[试验]:为主健生成自增序列号
drop table foo;
create table foo(id number, data varchar2(20));
create sequence foo_seq;
create or replace trigger bifer_foo_id_pk
before insert on foo
for each row
begin
select foo_seq.nextval into :new.id from dual;
end;
/
insert into foo(data) values(‘donny’);
insert into foo values(5,’Chen’);
select * from foo;
3、 INSTEAD OF 触发器更新视图
Create or replace view company_phone_book as
Select first_name||’, ’||last_name name, email, phone_number,
employee_id emp_id
From hr.employees;
尝试更新email和name
update hr.company_phone_book
set name=’Chen1, Donny1’
where emp_id=100
create or replace trigger update_name_company_phone_book
INSTEAD OF
Update on hr.company_phone_book
Begin
Update hr.employees
Set employee_id=:new.emp_id,
First_name=substr(:new.name, instr(:new.name,’,’)+2),
last_name= substr(:new.name,1,instr(:new.name,’,’)-1),
phone_number=:new.phone_number,
email=:new.email
where employee_id=:old.emp_id;
end;
4、 系统事件触发器
系统事件:数据库启动、关闭,服务器错误
create trigger ad_startup
after startup
on database
begin
-- do some stuff
end;
/
5、 用户事件触发器
用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE /
RENAME / TRUNCATE / LOGOFF
例子:记录删除对象
1. 日志表
create table droped_objects(
object_name varchar2(30),
object_type varchar2(30),
dropped_on date);
2.触发器
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;
/
3. 测试
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,所以也不允许使用
视图:
dba_triggers
Refer to : http://www.souzz.net/html/database/ORACLE/20428.html
是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
Instance:
create trigger biufer_employees_department_id
before insert or update of department_id
on employees
referencing
old as old_value
new as new_value for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
触发器的组成部分:
1、 触发器名称
2、 触发语句
3、 触发器限制
4、 触发操作
1、 触发器名称(Given Name)
create trigger [Trigger Name]
2、 触发语句
before/after insert or update of [Columns Name||department_id]
on [Table Name||employees]
referencing old as old_value
new as new_value
for each row
表或视图上的DML语句 DDL语句 数据库关闭或启动,startup shutdown 等等
说明:
1、 无论是否规定了department_id ,对employees表进行insert的时候
2、 对employees表的department_id列进行update的时候
3、 触发器限制
when (new_value.department_id<>80 )限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。其中的new_value是代表跟新之后的值。
4、 触发操作
是触发器的主体
begin
:new_value.commission_pct :=0;
end;
主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。
触发器类型:
1、 语句触发器
2、 行触发器
3、 INSTEAD OF 触发器
4、 系统条件触发器
5、 用户事件触发器
1、 语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、
DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次
。比如,无论update多少行,也只会调用一次update语句触发器。
例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number);
Create trigger biud_foo
Before insert or update or delete
On foo
Begin
If user not in (‘DONNY’) then
Raise_application_error(-20001, ‘You don’t have access to modify this table.’);
End if;
End;
/
即使SYS,SYSTEM用户也不能修改foo表
[试验]
对修改表的时间、人物进行日志记录。
1、 建立试验表
create table employees_copy as select *from hr.employees
2、 建立日志表
create table employees_log(
who varchar2(30),
when date);
3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger biud_employee_copy
Before insert or update or delete
On employees_copy
Begin
Insert into employees_log(
Who,when)
Values( user, sysdate);
End;
/
4、 测试
update employees_copy set salary= salary*1.1;
select *from employess_log;
5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判断:
begin
if inserting then
-----
elsif updating then
-----
elsif deleting then
------
end if;
end;
if updating(‘COL1’) or updating(‘COL2’) then
------
end if;
[试验]
1、 修改日志表
alter table employees_log
add (action varchar2(20));
2、 修改触发器,以便记录语句类型。
Create or replace trigger biud_employee_copy
Before insert or update or delete
On employees_copy
Declare
L_action employees_log.action%type;
Begin
if inserting then
l_action:=’Insert’;
elsif updating then
l_action:=’Update’;
elsif deleting then
l_action:=’Delete’;
else
raise_application_error(-20001,’You should never ever get this error.’);
Insert into employees_log(
Who,action,when)
Values( user, l_action,sysdate);
End;
/
3、 测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
values(12345,’Chen’,’Donny@hotmail’,sysdate,12);
select *from employees_log
update employees_copy set salary=50000 where employee_id = 12345;
2、 行触发器
是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:
1、 定义语句中包含FOR EACH ROW子句
2、 在BEFORE……FOR EACH ROW触发器中,用户可以引用受到影响的行值。
比如:
定义:
create trigger biufer_employees_department_id
before insert or update
of department_id
on employees_copy
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/
Referencing 子句:
执行DML语句之前的值的默认名称是ld ,之后的值是 :new
insert 操作只有:new
delete 操作只有ld
update 操作两者都有
referencing子句只是将new 和old重命名为new_value和old_value,目的是避免混淆。比如操作一个名为
new的表时。
作用不很大。
[试验]:为主健生成自增序列号
drop table foo;
create table foo(id number, data varchar2(20));
create sequence foo_seq;
create or replace trigger bifer_foo_id_pk
before insert on foo
for each row
begin
select foo_seq.nextval into :new.id from dual;
end;
/
insert into foo(data) values(‘donny’);
insert into foo values(5,’Chen’);
select * from foo;
3、 INSTEAD OF 触发器更新视图
Create or replace view company_phone_book as
Select first_name||’, ’||last_name name, email, phone_number,
employee_id emp_id
From hr.employees;
尝试更新email和name
update hr.company_phone_book
set name=’Chen1, Donny1’
where emp_id=100
create or replace trigger update_name_company_phone_book
INSTEAD OF
Update on hr.company_phone_book
Begin
Update hr.employees
Set employee_id=:new.emp_id,
First_name=substr(:new.name, instr(:new.name,’,’)+2),
last_name= substr(:new.name,1,instr(:new.name,’,’)-1),
phone_number=:new.phone_number,
email=:new.email
where employee_id=:old.emp_id;
end;
4、 系统事件触发器
系统事件:数据库启动、关闭,服务器错误
create trigger ad_startup
after startup
on database
begin
-- do some stuff
end;
/
5、 用户事件触发器
用户事件:用户登陆、注销,CREATE / ALTER / DROP / ANALYZE / AUDIT / GRANT / REVOKE /
RENAME / TRUNCATE / LOGOFF
例子:记录删除对象
1. 日志表
create table droped_objects(
object_name varchar2(30),
object_type varchar2(30),
dropped_on date);
2.触发器
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;
/
3. 测试
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,所以也不允许使用
视图:
dba_triggers
Refer to : http://www.souzz.net/html/database/ORACLE/20428.html
发表评论
-
Oracle中有关Group by 中avg();sum();min();max();count();的运用整理(Oracle的执行顺序)
2011-06-15 18:11 29399表 tabzx: select * from tabzx ... -
(Oracle) Oracle入门基础理论
2011-06-08 19:29 11890一:Oracle的概述 什么 ... -
(Index)Oracle 中Index的运行机制
2011-06-01 12:12 7012从表单访问数据时,Orac ... -
(数据库范式) 第一范式(1NF);第二范式(2NF);第三范式(3NF)
2011-05-30 10:22 1357第一范式(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 2364在一个ORACLE数据库 ... -
续触发器:instead of ;事件触发--用户和系统
2011-05-26 18:04 2055定义:instead of 1) 基于view ... -
(trigger)触发器的定义和作用
2011-05-25 16:00 17839第一:触发器(trigger) 触发器(trigger)是指 ... -
Oracle中的loop循环的例子
2011-05-25 15:07 28447第一:loop... exit when...end loop ... -
(oracle)如何通过函数去调用procedure的注意事项
2011-05-25 12:06 1671创建一个带参数的procedure temp_pr(): c ... -
在oracle中创建一个exception
2011-05-24 19:24 867Gramma: 1:声明一个exceptin: d ... -
(oracle)如何创建和使用procedure
2011-05-24 18:44 30631:定义procedure(在高级 ... -
(笔记)如何声明使用cursor及其属性
2011-05-24 14:55 2399Defined 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 992Definition: cursor的作用是从数据表中提取来 ... -
(cursor)How to define and implement THE CURSOR
2011-05-24 11:24 1Definition: cursor的作用是从数据表中提取来 ... -
(savepoint) savepoint--rollback
2011-05-24 10:38 1113语法: savepoint 保存点的名称; roll ... -
(笔记)Oracle中的表达式
2011-05-23 16:44 1212(1)数值表达式--+(加法),-(减法),*(乘法),/(除 ... -
(笔记)基本复合型数据类型的声明
2011-05-23 16:16 1085--(1)使用%type定义变量 -- declare n ...
相关推荐
标题中的"cx_Oracle-7.3.0_oracle_cx_oracle_cx_Oracle7.3对应_python_jupyteror" 提到了一个关键的Python库——cx_Oracle,它是Python与Oracle数据库之间的一个接口,允许Python程序员使用Oracle的全部功能。...
my_notebook_of_r_language._我的R语言学习笔记_learn_r
轨道力学笔记_Jupyter Notebook_JavaScript_下载
本压缩包“oracle-record.rar_oracle”包含的学习资料,主要是关于Oracle数据库的实际操作案例,非常适合对Oracle感兴趣的初学者或正在学习Oracle的人员进行实践练习。 `record notebook.txt`可能包含了用户在操作...
【北京大学】人工智能实践:Tensorflow笔记_手敲代码共享_tensorflow_notebook
ant前端面试复习笔记_Front-End-Interview-Notebook
这个压缩包“用于数字信号处理的Jupyter笔记本_Jupyter Notebook_下载.zip”很可能包含了一系列教程或者项目,帮助学习者深入理解和应用数字信号处理的概念。 Jupyter Notebook 是一个开源的Web应用程序,它支持...
《力学教学中的Jupyter Notebook应用详解》 在现代科学教育中,Jupyter Notebook已经成为一种极为重要的工具,尤其在力学教学领域。它集成了代码、文本、图像和数学公式,为教师和学生提供了一种交互式的、直观的...
【标题】: "notebook_机器学习_图片识别_" 这个标题揭示了我们将要探讨的主题是关于使用机器学习技术进行图片识别,特别是针对蜜蜂种类的识别。在这个项目中,我们很可能会利用深度学习模型,如卷积神经网络(CNNs...
该项目是一个基于Jupyter Notebook的计算机学习笔记设计源码,包含531个文件,涵盖286个Markdown笔记、164个JPG图片、39个PNG图片、22个Python脚本、13个交互式笔记本以及少量其他类型文件,如C++代码、HTML和CSV...
【学习笔记5_逐层可视化图像特征-薛开宇1】这篇笔记主要讲解了如何在深度学习框架Caffe中逐层可视化图像特征。这是一项重要的技能,有助于理解卷积神经网络(CNN)的工作原理和特征提取的过程。 1. **开始IPython ...
百万歌曲数据集的机器学习方法_Jupyter Notebook_Pyth.zip
本资料包“用于油藏模拟的机器学习框架_C++_Jupyter Notebook_下.zip”提供了一个基于C++语言和Jupyter Notebook的机器学习框架,用于解决这一问题。 首先,C++是一种高效且广泛应用的编程语言,尤其适用于科学计算...
金融信号表示和交易的深度学习模型_Jupyter Notebook_下载.zip
用于大规模交通信号控制的多代理深度强化学习。_Python_Jupyter Notebook_下载.zip
python学习笔记(八)jupyter notebook 源代码,用jupyter notebook打开。
**Jupyter Notebook 一般用法详解** Jupyter Notebook 是一个基于Web的应用程序,它为数据科学家、研究人员和工程师提供了一个交互式的环境,用于编写和运行代码、创建文档、展示结果和分享工作。Jupyter Notebook ...
“java学习笔记(jsp).txt”和“jsp学习笔记(小项目:jsp留言本).txt”则关注JavaServer Pages(JSP),这是一种动态网页技术,用于构建Web应用程序。通过结合HTML、Java代码和表达式语言,JSP可以创建交互式的...
5. **自定义外观**:可以使用`gtk_notebook_set_tab_pos()`来调整标签的位置(上、下、左、右),或者通过`gtk_notebook_set_show_tabs()`和`gtk_notebook_set_show_border()`来控制是否显示标签和边框。 6. **其他...
Click on a notebook and replace https://github.com/ with https://colab.research.google.com/github/ in the notebook URL or use this Chrome extension to do it with one click. Sign into your Google ...