当前位置:网站首页>Oracle-触发器和程序包
Oracle-触发器和程序包
2022-07-05 07:31:00 【旷世奇才李先生】
万般皆下品、惟有读书高
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。
文章目录
一、触发器的概念
1、触发器的基本概念
触发器本身是一段程序代码,类似于存储过程和函数,但是与存储过程和函数不同的是,存储过程和函数创建后保存在oracle数据库中,如果要执行需要用户调用才可以。触发器创建完成后,以独立的对象存储在oracle数据库中,根据事先定义的触发事件来决定是否执行,只要发生这些触发事件,触发器就会自动执行。另外,触发器不能接收参数。
触发器通常由触发器头部和触发体两部分组成,可以具体细分为如下几方面。
1、作用对象:包括数据表、视图、数据库和模式。
2、触发事件:指可以引起触发器执行的事件。例如,DML语句中对数据表或者视图执行数据操作的insert、update、delete语句;DDL语句中执行创建、修改或者删除的cretae、alter、drop语句以及数据库系统的事件,包括oracle系统启动或者退出、异常错误等。
3、触发条件:由when子句指定的一个逻辑表达式,当触发事件发生时,如果该逻辑表达式的值为true时,触发器就会自动执行。
4、触发事件:指触发器指令执行是在触发事件发生之前,还是在触发事件发生之后。
5、触发级别或者触发频率:分为语句级和行级触发器。语句级触发器是默认的,指触发事件发生后,触发器只执行一次;行级触发器指触发事件每作用于一个记录,触发器就执行一次。
2、触发器的分类
根据触发器的使用范围不同,可以把触发器分为3种:DML触发器、instead of触发器和系统触发器。
1、dml触发器
在执行dml语句时触发,可以定义为insert、update、delete操作,也可以定义在操作之前或者之后触发,也可以指定为行级触发或者语句级触发。
2、instead of触发器
它也被称为替代触发器,它是oracle专门为视图设计的一种触发器。在oracle数据库中,一般不能直接对两个以上的表建立的视图进行一般的触发器操作,如果必须修改,就使用替代触发器。
3、系统触发器
在oracle数据库的系统事件发生时进行触发,例如系统启动或者退出、异常错误等,这种系统触发器称为数据库触发器;或者发生ddl语句时触发,例如执行创建、修改或者删除的create、alter、drop语句等,这种触发器称为模式触发器。
二、触发器的创建
基本语法
create or replace trigger<触发器名><触发时间><触发事件>on<表名>|<视图名>|<数据库名>|<模式名>
[for each row]
[when<条件表达式>]
begin
<pl/sql语句>
end
其中的参数说明如下:
1、or replace为可选参数,如果数据库中已经存在要创建的触发器,则先把原先的触发器删除,再重新建立触发器,或者说覆盖原先的触发器。
2、触发时间包含before和after两种,before指触发器是在触发事件发生之前执行,after指触发器在触发事件发生之后执行。
3、触发事件,例如insert,update,delete,create,alter,drop等。
4、<pl/sql语句>是要执行的触发器操作。
1、DML触发器的创建
dml触发器在执行dml语句时触发,可以分为insert、update和delete操作,可以定义在操作之前或者之后触发,也可以指定为行级触发或者语句级触发。
1、语句级dml触发器的创建
它是默认的dml触发器的创建,不使用for each row子句。语句触发器所对应的dml语句影响表中符合条件的所有行,但触发器只执行一次,并且不再使用when条件语句。
1、创建触发器,当对student表进行添加记录、更新记录和删除记录的时候,判断是否是工作时间段,如果不是工作时间段,不允许执行。
create or replace trigger tri_detect
before insert or update or delete --定义触发时间和触发事件
on student
begin
if to_char<sysdate,'HH24:MI'> not between '09:00' and '17:00'; --给出判断条件的工作时间
or to_char<sysdate,'DY','nls_date_lancuage=american'> in <'sat','sun'> then
raise_application_error<-20005,'不是正常的工作时间,不能执行dml操作'>; --不符合条件,给出提示信息
end if;
end;
2、在数据表student上创建触发器,当在该表上插入、删除或者更新的时候,记录操作日志。
create or replace trigger tri_log
after insert or delete or update on student --定义触发事件和触发时间
declare
var_user varchar2<20>;
var_action varchar2<20>; --定义局部变量
begin
select distinct user into var_user from all_users; --获取用户
if inserting then --判断是否是“插入”
insert into stu_log values<var_user,'插入',sysdate>;
elsif deleting the --判断是否是“删除”
insert into stu_log values<var_user,'删除',sysdate>;
else --判断是否是“更新”
insert into stu_log values<var_user,'更新',sysdate>;
end if;
end;
2、INSTEAD OF触发器的创建
在创建之前先创建一个视图,视图关联数据表,student、teacher。
create view test_view as
select s.id,s.name,t.id,t.name
from student s,teacher t
where s.id=t.sid;
这个时候我们向视图中插入数据会报错,我们只有通过创建instead of触发器来实现。
1、创建instead of 触发器已实现修改视图test_view中的内容
create or replace trigger tri_view
instead of insert
on test_view
for each row
declare
var_row dept%rowtype;
begin
select * into var_row from student where id=:new.id;
if sql%found then
insert into student<id,name,class> values <:new.id,:new.name,:new.class>;
end if;
exception
when no_data_found then
insert into student<id,name> values<:new.id,:new.name>;
insert into teacher<id,name,sid> values<:new.id,:new.name,:new.sid>;
end;
3、系统触发器
1、当登录或者退出的时候,向日志表中添加数据
create or replace trigger user_login
after logon on database --登录触发
begin
insert into user_log<user_name,login_date> values <ora_login_user,systimestamp>;
end user_login;
4、触发器的禁用和启用
在oracle数据库中,触发器可以修改他的状态,使其有效或者无效,即启用或者禁用
语法格式如下。
alter trigger 触发器名称 [disable | enable]
参数说明:disable是触发器禁用参数,既使触发器处于无效状态;enable是触发器启用参数,即使触发器处于有效状态。
例如下面禁用触发器
alter trigger tri_ddl disable;
5、触发器的查看和删除
想查看所有的触发器信息,可以使用数据字典user_triggers,这个数据字典有很多字段可以查看所有触发器的名称、类型、表名、拥有者等信息。
select trigger_name,trigger_type,table_name from user_triggers;
删除触发器
drop trigger 触发器名称
三、程序包
1、程序包的创建
程序包由包规范和包体两部分组成,因此程序包的创建也分为两部分,分别为包规范的创建和包体的创建。
1、包规范的创建
包规范提供应用程序的接口,在包规范中声明程序包中可以使用的变量、数据类型、存储过程、函数、异常等。不过函数和过程只包括原型信息,即只有头部的声明,不包括任何实现的代码,其实现代码在包体中定义。以下是语法格式。
create or replace package 程序包名称
isias
类型声明 | 变量声明 | 异常声明 | 过程声明 | 函数声明
end [程序包名称]
2、包体的创建
在包体中包含规范中声明的过程和函数的实现代码,此外,还可以声明其他没有在包规范中声明的变量、类型、过程、函数,但他们只能在包中使用,不能被其他应用程序调用。下面就是语法格式
create or replace package body 程序包名称
isias
[<内部变量声明>]
[过程体]
[函数体]
end [程序包名称]
2、程序包的删除
删除包括两步,先删除程序包体,再删除包规范。语法如下
drop package body 程序包名称
drop package 程序包名称
四、总结
这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。
可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。
边栏推荐
- [tf1] save and load parameters
- And play the little chestnut of dynamic agent
- Negative number storage and type conversion in programs
- Typecho adds Baidu collection (automatic API submission plug-in and crawler protocol)
- 氫氧化鈉是什麼?
- The number of occurrences of numbers in the offer 56 array (XOR)
- SOC_ SD_ DATA_ FSM
- Import CV2, prompt importerror: libcblas so. 3: cannot open shared object file: No such file or directory
- (top) pretty girl binary color code portal
- Idea common settings
猜你喜欢
随机推荐
Cookie operation
611. 有效三角形的个数
The folder directly enters CMD mode, with the same folder location
Differences between pycharm and idle and process -- join() in vs Code
Miracast技术详解(一):Wi-Fi Display
第 2 章:小试牛刀,实现一个简单的Bean容器
Matrix and TMB package version issues in R
Close of office 365 reading
Today, share the wonderful and beautiful theme of idea + website address
Explanation of parallel search set theory and code implementation
Rough notes of C language (2) -- constants
HDU1232 畅通工程(并查集)
Database SQL practice 3. Find the current salary details of the current leaders of each department and their corresponding department number Dept_ no
[framework] multi learner
Play with grpc - go deep into concepts and principles
Web page Chinese display (print, etc.) GBK error, solution, software
ORACLE CREATE SEQUENCE,ALTER SEQUENCE,DROP SEQUENCE
[idea] efficient plug-in save actions to improve your work efficiency
Deepin, help ('command ') output saved to file
QT small case "addition calculator"