Oracle触发器和程序包的基本介绍

目录
  • 一、触发器的概念
    • 1、触发器的基本概念
    • 2、触发器的分类
  • 二、触发器的创建
    • 1、DML触发器的创建
    • 3、系统触发器
    • 4、触发器的禁用和启用
    • 5、触发器的查看和删除
  • 三、程序包
    • 1、程序包的创建
    • 2、程序包的删除
  • 四、总结

一、触发器的概念

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 程序包名称

四、总结

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

到此这篇关于Oracle触发器和程序包的文章就介绍到这了,更多相关Oracle触发器和程序包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Oracle 触发器实现主键自增效果

    触发器的作用 触发器的作用类似拦截器.把一些针对数据库的DML操作(insert/update/delete/select)进行拦截,符合业务要求的进行操作,不符合要求的操作可以通过抛出异常来阻止 说白了就是数据确认(after)与安全性检查(before),此外触发器不针对select操作 1.首先创建表testUser         Oracle设置为不区分大小的,所以table名,言简意赅即可. CREATE TABLE testUser ( id NUMBER ( 11 ) prima

  • Oracle中的触发器trigger

    触发器是指被隐含执行的存储过程 一.创建DML触发器(before/after) 1.行触发器: 当一个DML操作影响DB中的多行时,对于其中复合触发条件的每行均触发一次(for each row) 例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去. CREATE OR REPLACE TRIGGER tr_del_emp BEFORE DELETE --指定触发时机为删除操作前触发 ON scott.emp FOR EACH ROW --说明

  • Oracle触发器用法实例详解

    本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好了.这里面需要说明一下,触发器可以分为语句级触发器和行级触发器.详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发.而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次. 具体举例: 1.

  • Oracle 触发器trigger使用案例

    目录 一.触发器定义 二.触发器分类 三.触发器功能 四.触发器语法 五.触发器使用案例 案例1:向job1表中插入一条数据后输出欢迎加入语句 案例2:数据校验,不允许星期二和星期四向emp1表中插入/更新数据. 案例3:创建触发器,记录表的删除数据 案例4:创建触发器,记录表的更新数据 一.触发器定义 Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码器.触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等. 二.触发器分类 触发器分

  • Oracle触发器trigger详解

    触发器相关概念及语法 概述 本篇博文中主要探讨以下内容: 什么是触发器 触发器的应用场景 触发器的语法 触发器的类型 案例 数据: 触发器的概念和第一个触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句. 每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列. 举个简单的例子: 当员工表中新增一条记录后,自动打印"成功插入新员工" create or replace trigger inser

  • Oracle触发器和程序包的基本介绍

    目录 一.触发器的概念 1.触发器的基本概念 2.触发器的分类 二.触发器的创建 1.DML触发器的创建 3.系统触发器 4.触发器的禁用和启用 5.触发器的查看和删除 三.程序包 1.程序包的创建 2.程序包的删除 四.总结 一.触发器的概念 1.触发器的基本概念 触发器本身是一段程序代码,类似于存储过程和函数,但是与存储过程和函数不同的是,存储过程和函数创建后保存在oracle数据库中,如果要执行需要用户调用才可以.触发器创建完成后,以独立的对象存储在oracle数据库中,根据事先定义的触发

  • Oracle创建带有参数的视图代码介绍

    在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们可以变个方式,使用程序包来实现 首先定义程序包: /* 按个人需要定义,我定义三个参数 ,因我项目程序需要,所以三个参数都是number ,当然可定义其它类型 但切记,第二个create 的参数类型等需以第一个create一致,否则程序包创建失败 */ create or replace package p_view_param is --参数一 function set_param(num number) return nu

  • Oracle触发器实例代码

    Oracle触发器,用于选单后修改选单的表的触发动作. --备货检验选单后 回写备货状态 CREATE OR REPLACE TRIGGER tri_TobaccoStockINSERT after INSERT ON "TobaccoStockQuality" FOR each ROW BEGIN UPDATE "GoodsStock" SET "FirstCheckState"=-1 WHERE "ID"=:NEW.&qu

  • oracle 触发器 实现出入库

    用语言实现 好处: 1.可以减少对数据库的访问. 2.可移植性好. 坏处: 1.操作起来考虑的东西较多,修改一处就要修改别一处.也就是说是相互关联的.如果少改了某一处,很可能使数据不一致. 用触发器实现 好处: 1.可以使程序员从复杂的相互关联中解放出来,把精力放在复杂的业务上. 坏处: 1.可移植性差. 下面我就用一个例子实现一个简单的出入库.因为是例子表中所用到的字段很少.这里的例子只做为抛砖引玉. 数据表为入库金额表(以下简称入库表)income,出库金额表(以下简称出库表)outlay,

  • 使用npm发布Node.JS程序包教程

    npm是Node.JS的程序包管理器.进行Node.JS开发时,经常使用它安装/卸载程序包.实际上,发布程序包的工作也是由它来完成的. 配置package.json 要打包程序,首先要配好各项设置,这些设置都由程序包根目录下的package.json指定.package.json的内容必须是严格的JSON格式,也就是说: 1.字符串要用双引号括起来,而不能用单引号: 2.属性名一定要加双引号: 3.最后一个属性后千万不要多加一个逗号. 配置对象的属性很多,具体可以参阅这里,这里列一下常用的项目:

  • linux中误删除程序包恢复实例

    本文主要是介绍linux中误删除程序包恢复实例,小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 以CentOS-7.2为例: 删除kernel包,无法重启: 1.删除kernel包 2.重启,无法启动 3.再次重启,出现进度条时按下Esc键,出现如下界面,选择从光盘启动 4.进入如下界面,选择Troubleshooting 5.选择救援模式,Rescue a CentOS system 6.键入回车 7.选择Continue ,键入1,进入 8.回车进入shell

  • Python程序包的构建和发布过程示例详解

    关于我 编程界的一名小程序猿,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. 联系:hylinux1024@gmail.com 当我们开发了一个开源项目时,就希望把这个项目打包然后发布到 pypi.org 上,别人就可以通过 pip install 的命令进行安装.本文的教程来自于 Python 官方文档 , 如有不正确的地方欢迎评论拍砖. 0x00 创建项目 本文使用到的项目目录为 ➜ packaging-tuto

  • springBoot 打war包 程序包com.sun.istack.internal不存在的问题及解决方案

    使用的是 idea - Lifecycle-package 的方式打包(maven) 确认  <packaging>war</packaging> 修改启动类: (原启动类) public class ExampleApplication { public static void main(String[] args) { SpringApplication.run(ExampleApplication.class, args); } } 修改为: public class Exa

随机推荐