oracle视图带数组,oracle 触发器、视图、自定义部类和数组

当前位置:我的异常网» 数据库 » oracle 触发器、视图、自定义部类和数组

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

www.myexceptions.net  网友分享于:2013-07-23  浏览:6次

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

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;

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值