oracle 触发器、视图、自定义类型和数组ITeye - 乐橙lc8

oracle 触发器、视图、自定义类型和数组ITeye

2019-01-12 10:52:19 | 作者: 子昂 | 标签: 触发器,视图,类型 | 浏览: 2009

1:视图(view)

视图的效果:
A:操控数据拜访
B:简化查询
C:数据独立性
D:能够操控视图中的数据的操作权限。

2:怎么创立视图:
grant create view to 用户。


3:创立单张表的视图:
create or replace view v_mc as
Select nid,sname,sdescription,nprice
from t_mc

4:创立多张表的视图:
create or replace view v_mc2 as
Select a.nid,a.sname,a.nprice,a.nmaxid,
a.nminid,b.sname as 大类别,c.sname as 小类别
from t_mc a,t_mc_type b,t_mc_type c
where a.nmaxid = b.nid
and a.nminid = c.nid

5:视图的insert/update/delete操作:

A:只要契合必定条件的视图才干做增修正的操作。
不能有如下条件(组函数、GROUP BY子句、DISTINCT 关键字、ROWNUM 伪列、列的界说为表达式)

B:只读的视图:with read only;

6:删去视图。


7:自界说类型:

Record:

cursor cs_table1 is Select * from v_table1;
type Table1_Record is Record(
year varchar2(10),
month1 number,
month2 number,
month3 number,
month4 number,
month5 number
);
--var_table1_record Table1_Record;
var_table1_record cs_table1%rowtype;

运用rowType与Record接纳游标中行数据类型的差异:

假如运用显现游标的话,由于SQL句子在编译期间现已断定,所以
能够直接运用rowType类型来代替Record类型。

但假如是运用动态游标的话,由于SQL在运行期间才干断定。因而不能

运用rowType类型。只能运用Record类型。


调集:

联合表 HashTable

嵌套表 Set

数组 数组

1:联合表的下标没有-24999到24999。下标能够随意拜访。

  嵌套表和数组的下标是从1开端。

2:联合表在界说的时分,PL/SQL会主动初始化。

  嵌套表和数组,界说的时分不会主动初始化。往数组中增加元素之间,
 
  有必要运用结构办法做一初始化的操作。

参阅
调集内建函数:

COUNT 回来调集中元素的个数
DELETE 删去调集中所有元素
DELETE(x) 删去元素下标为x的元素,假如x为null,则调集坚持不变 对VARRAY不合法
DELETE(x,y) 删去元素下标从X到Y的元素,假如X Y调集坚持不变 对VARRAY不合法
EXIST(x) 假如调集元素x现已初始化,则回来TRUE, 不然回来FALSE
EXTEND 在调集结尾增加一个元素 对Index_by不合法
EXTEND(x) 在调集结尾增加x个元素 对Index_by不合法
EXTEND(x,n) 在调集结尾增加元素n的x个副本 对Index_by不合法
FIRST 回来调集中的第一个元素的下标号,关于VARRAY调集一直回来1。
LAST 回来调集中最终一个元素的下标号, 关于VARRAY回来值一直等于COUNT。
LIMIT 回来VARRY调集的最大的元素个数,关于嵌套表和Index_by调集无用。
NEXT(x) 回来在元素x之后及紧挨着它的元素的值,假如该元素是最终一个元素,则回来null。
PRIOR(x) 回来调集中在元素x之前紧挨着它的元素的值,假如该元素是第一个元素,则回来null。
TRIM 从调集结尾开端删去一个元素 对index_by不合法
TRIM(x) 从调集结尾开端删去x个元素 对index_by不合法





8:触发器
创立触发器语法:
CREATE [OR REPLACE] TRIGGER trigger_name
[AFTER | BEFORE | INSTEAD OF]
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old_value / NEW [AS] new_value}]
[FOR EACH ROW[WHEN (condition)]]
[declare 界说变量]
begin
trigger_body;
end trigger_name;

阐明:[REFERENCING {OLD [AS] old_value / NEW [AS] new_value}]
指能够经过referencing 把行级触发器中默许相关性标识符:OLD,:NEW 重命名为新的姓名,一般没必要更改姓名
[INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE]
[INSERT] [[OR] UPDATE [OF column_list]]--指定更新的列名才触发


触发器的类型:
(一)DML触发器--对表或许视图履行DML 句子时触发
1、句子级触发器
对每个DML句子履行只履行一次,不论受影响的行数是多少,都只履行一次
2、行级触发器
对DML句子影响的每一行都履行一次
3、INSTEAD OF 触发器或许代替触发器
此触发器是界说在视图上的,而不是界说在表上的。它是用来替换所运用实践句子 的触发器
(二)数据库级触发器或许体系事情触发器
Oracle数据库体系的事情中进行触发的触发器,如oracle体系的发动与封闭
(三)形式(DDL)触发器或许用户事情触发器
是指与数据库界说句子DDL或许用户的登录、刊出等事情相关的触发器,如用户连 接到数据库,修正表结构等。

其间:DATABASE表明创立数据库级触发器,数据库级要给出数据库事情;SCHEMA表明创立形式级触发器,形式级要给出形式事情或DDL事情。
SCHEMA 表明用户计划


----------------DML触发器具体阐明--------------------
/*
  new与old目标阐明
 
  insert:只要new目标
  delete:只要old目标
  update:new和old目标都有
 
  DML
  行级触发器:具有old和new目标
  句子级触发器:没有new和old目标,由于句子级操作针对一次操作,无法取得恣意记载。
 
  ---------------------------------------------------------------------------
 
  行级触发器关键:1.new和old目标,2.谓语动词“inserting,deleting,updating”的运用
  句子级触发器关键:1.没有new和old目标。2.没有for each row
  instead of 触发器关键:1.不论有没有加for each row 都是行级类别

*/

视图:相当于虚拟表或许逻辑表,视图一般由多个基表衔接而成,这种视图不允许进行insert,update,delete这样的DML操作。
当为视图编写INSTEAD OF 触发器后,用户对视图的DML操作就不会履行,而是履行触发器中的PL/SQL句子块,这样就能够经过在INSTEAD OF触发器中编写恰当的代码对构成视图的各个表进行操作。

grant create view to scott;//system/oracle 登陆 授权给scott
--创立视图
create or replace view emp_dept_view as select empno,ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;

insert into emp_dept_view(empno,ename,job,sal,dname)
values (8088,name8088,manager,6000,oracle);
delete emp_dept_view;


==================体系级触发器======================
--创立一张表记载数据库用户登录的信息
grant ADMINISTER DATABASE TRIGGER to scott;--需求授权scott
create or replace trigger Login_Log_trig
  after Logon on database 

begin
  insert into login_log
  values(seq_login.nextval,ora_login_user,ora_client_ip_address);
end Login_Log_trig;
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表乐橙lc8立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章