当前位置:Gxlcms > 数据库问题 > 数据库触发器 、包

数据库触发器 、包

时间:2021-07-01 10:21:17 帮助过:21人阅读

触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。

功能:

1 、 允许 / 限制对表的修改

2 、 自动生成派生列,比如自增字段

3 、 强制数据一致性

4 、 提供审计和日志记录

5 、 防止无效的事务处理

6 、 启用复杂的业务逻辑

开始 :

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 、 触发器名称

create trigger biufer_employees_department_id

命名习惯:

biufer ( before insert update for each row )

employees 表名

department_id 列名

 

2 、 触发语句

比如:

表或视图上的 DML 语句; DDL 语句,数据库关闭或启动 ,startup shutdown 等等

before insert or update

  of department_id

  on employees

  referencing old as old_value

     new as new_value

  for each row

说明:

( 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 、 用户事件触发器

包 :是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。

         把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。

一个包由两个分开的部分组成:

         包定义(PACKAGE):包定义部分声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

         包主体(PACKAGE BODY):包主体则是包定义部分的具体实现,它定义了包定义部分所声明的游标和子程序,在包主体中还可以声明包的私有元素。 包定义和包主体分开编译,并作为两部分分开的对象存放在数据库字典中。

包定义的语法如下:

              CREATE [OR REPLACE] PACKAGE package_name {IS | AS}

              [公有数据类型定义[公有数据类型定义]…] [公有游标声明[公有游标声明]…] [公有变量、常量声明[公有变量、常量声明]…] [公有子程序声明[公有子程序声明]…]

              END [package_name];

包体定义的语法如下:

              CREATE [OR REPLACE] PACKAGE BODY package_name {IS | AS}

              [私有数据类型定义[私有数据类型定义]…] [私有变量、常量声明[私有变量、常量声明]…] [私有子程序声明和定义[私有子程序声明和定义]…] [公有子程序定义[公有子程序定义]…] BEGIN PL/SQL 语句

              END [package_name];

PL/SQL 允许对包内子程序和本地子程序进行重载。所谓重载时指两个或多个子程序有相同的名称,但拥有不同的参数变量、参数顺序或参数数据类型。

              使用 DROP PACKAGE 命令对不需要的包进行删除。

 

数据库触发器 、包

标签:组成   ddl   mail   开始   类型   down   job   声明   表名   

人气教程排行