开发手册 欢迎您!
软件开发者资料库

创建其他架构对象

创建其他模式对象 - Oracle数据库11g准备工作指南管理员认证助理,OPN认证专家考试。本指南可帮助您逐步在线准备证书考试,并且完全免费。此认证旨在使您获得赢得基于Oracle SQL的项目的简短列表。 Oracle技术认证是一种有价值的,行业认可的凭证,表明已经证明的知识水平和技能。

除了表之外,其他基本模式对象是视图,序列,索引和同义词.视图是逻辑或虚拟表.同义词只是数据库对象的别名.同义词还简化了查询编写,并通过伪装数据库对象的实际名称来提供系统安全性元素.序列是支持自动生成整数值的特殊数据库对象,通常用于为表生成主键值.在表列上创建索引以便于从表中快速检索信息.

视图

数据库视图是基于查询的逻辑或虚拟表.查询视图就像表一样.这意味着从您作为开发人员的角度或从数据库系统用户的角度来看,视图看起来像一个表.视图作为对象的定义是存储在数据库的数据字典中;但是,视图本身不存储数据.数据库还存储用于创建视图的执行计划 - 这意味着即使未存储由视图的SELECT查询呈现的实际数据,也可以通过使用视图快速检索数据作为视图的一部分.每次从定义视图的数据库表中查询视图时,数据都"聚集在一起" - 这些被称为基表.

下面给出了一般语法.

 CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [ViewName]  [(列别名......)]  AS [查询]  [WITH [CHECK OPTION] [只读] [CONSTRAINT]];


根据语法,

即使视图引用的基表尚不存在,FORCE选项也允许创建视图.此选项用于在实际创建基表和附带数据之前创建视图.

NOFORCE选项与FORCE相反,允许系统用户创建视图(如果他们具有创建视图所需的权限),以及创建视图的表是否已创建存在.这是默认选项.

WITH READ ONLY选项允许创建只读的视图.您不能使用DELETE,INSERT或UPDATE命令修改读取的数据-only view.

WITH CHECK OPTION子句允许更新可以通过视图选择的行.它还允许您指定值的约束.CONSTRAINT子句与WITH CHECK OPTION子句使数据库管理员能够为CHECK OPTION分配唯一的名称.如果数据库管理员省略了CONSTRAINT子句,Oracle将自动为该约束分配一个系统生成的名称,该名称不会很有意义.

视图类型

简单视图仅在一个表的顶部创建.它是一个简单的SELECT查询,没有函数或组子句,但只是选择没有任何转换的表中的列.如果在视图上执行DML,它将直接反映在基表中.

A Com使用连接在多个表上创建plex视图.它可以包含SQL函数,按函数分组.但由于视图是多个数据并且列的选择也不简单,因此它不允许对其进行DML操作.

插图

简单视图:以下简单视图选择JOB ID为DEV的员工的员工姓名,部门ID和薪水.

CREATE OR REPLACE VIEW v_emp_devASSELECT first_name, department_id, salaryFROM employeesWHERE job_id = 'DEV';


复杂视图:以下示例显示部门名称,部门中绘制的平均工资以及在其中工作的员工数量.

CREATE OR REPLACE VIEW EMP_VUASSELECT department_name, AVG (salary) avg_sal, COUNT (first_name) countFROM employees E, departments DWHERE E.department_id = D.department_idGROUP BY department_name;


DESCRIBE [视图名称] 描述了视图结构.列以与视图定义相同的顺序列出.

视图上的DML操作

可以在简单视图上轻松执行DML操作.如前所述,插入,更新和删除操作实际上发生在基表上.

当您在视图上执行UPDATE,DELETE或INSERT DML语句时,实际上是在操作定义视图的基表或表的数据行.对带有视图的UPDATE,DELETE和INSERT语句的使用有限制.首先,将UPDATE,DELETE或INSERT语句与视图一起使用,视图必须是可更新的.如果SELECT子句没有在SELECT列表中指定任何聚合函数,则视图是可更新的.另外,视图不能通过使用GROUP BY,DISTINCT或UNION子句或子句创建.它是允许的.它是允许的用于在FROM子句中的SELECT子查询中使用的聚合函数.此外,视图不能在SELECT列表中包含任何派生列.接下来,如果作为JOIN操作(连接视图)的结果创建视图,则UPDATE和INSERT语句一次只能修改或插入其中一个基表.您不能使用单个数据操作语言(DML)语句修改来自两个或多个表的行.最后,如果在FROM子句中引用了表,则只能对视图执行DELETE语句.这只是意味着您无法从未指定的表中删除行.

WITH CHECK OPTION子句

WITH CHECK OPTION是一个可选子句指定在通过视图插入或更新数据时要进行的检查级别.如果使用WITH CHECK OPTION子句创建视图,则通过视图在基表中插入或更新的每一行都必须符合视图定义.请注意,如果视图创建为只读,则无法指定该选项.

例如,为开发人员(JOB_ID = DEV)创建了一个视图V_EMP_DEV.

CREATE OR REPLACE VIEW v_emp_devASSELECT first_name, department_id, salary, FROM employeesWHERE job_id = 'DEV'WITH CHECK OPTION empvu_dev;


用户尝试通过视图更新HR员工的工资,但遇到异常.因为视图是用CHECK OPTION创建的.

UPDATE v_emp_devSET salary = salary+500WHERE JOB_ID = 'HR';ORA-01402: view WITH CHECK OPTION where-clause violation


如果它是一个简单的视图,UPDATE语句就不会引发任何异常./p>

删除视图


数据库管理员(DBA)或视图所有者可以使用DROP VIEW语句删除视图.如果视图定义了约束,那么你需要在删除视图时指定CASCADE CONSTRAINTS子句;否则,DROP VIEW语句无法处理.如果另一个视图或其他数据库对象(如同义词或物化视图(本章后面将讨论这两个对象)引用了一个删除的视图,Oracle不会丢弃这些数据库对象;相反,Oracle将它们标记为无效.您可以删除这些无效对象或重新定义它们以使它们再次有效.

以下DROP VIEW命令从数据库中删除视图EMP_VU./p>

 DROP VIEW EMP_VU;


序列


Oracle提供的功能为这种类型的用法生成唯一数字序列,它们被称为序列.通常,序列用于生成唯一的,连续的整数值,用作数据库表中的主键值.可以在任一数字中生成一系列数字升序或降序.注意序列生成的数字不能回滚.

语法

 CREATE SEQUENCE


根据语法,

CREATE SEQUENCE语句必须指定唯一的序列名称.这是声明中唯一必需的子句.如果未指定任何其他子句,则生成的所有序列号将遵循Oracle默认设置.

INCREMENT BY子句确定序列在生成每个数字时如何递增.默认增量为1;但是,如果您有充分的理由让序列跳过数字,则可以指定不同的增量.正数字增量会生成升序序列号,其间隔等于您选择的间隔.负数字增量会生成降序序列号.

START WITH子句指定序列的起始数值 - 默认起始编号为1.另外,如果列中已有一些包含数据的行,则必须指定起始值现在将存储序列值.

MAXVALUE子句指定序列可以递增的最大值.在没有MAXVALUE的情况下,可以为序列生成的最大允许值非常大,为10到27次幂 -  1.默认值为NOMAXVALUE.

MINVALUE子句指定递减序列的序列的最小值(按降序生成数字的序列).默认值为NOMINVALUE.

CYCLE子句指定如果序列达到指定的MAXVALUE,则可以重用序列值.如果序列循环,则会在START WITH值处再次生成数字.

CACHE子句可以通过使Oracle生成指定的一批序列号来存储在缓存中,从而提高系统性能记忆.

如果指定CACHE而未指定数字,则默认缓存大小为20个序列号.可选地,您可以指定NOCACHE以防止序列号缓存.

ORDER子句指定序列号按照请求它们的确切时间顺序分配.

NEXTVAL和CURRVAL

序列通过使用名为currval和nextval的两个伪列生成值.伪列的行为类似于表列,但伪列实际上并不存储在表中.第一次选择nextval伪列时,初始值为返回序列.随后选择nextval伪列会导致序列按INCREMENT BY子句中的指定递增,并返回新生成的序列值.currval伪列返回序列的当前值,即返回的值.最后一次引用nextval.

在会话中,NEXTVAL,没有CURRVAL必须是序列上的第一个动作.这是因为在会话中,当NEXTVAL从序列中生成第一个会话号时,Oracle会将当前值保留在CURRVAL中.

语法:

  Sequence.NEXTVAL  Sequence.CURRVAL


需要注意的要点 -

  • CURRVAL和NEXTVAL只能在select语句的外部SQL中使用.

  • 可以在INSERT语句中使用CURRVAL和NEXTVAL来替换列主键.它既可以用作子查询子句,也可以用在VALUES子句中.

  • CURRVAL和NEXTVAL可用于更新表中的值.

  • CURRVAL和NEXTVAL不能在VIEW选择列表中,使用DISTINCT关键字,使用GROUP BY,HAVING或ORDER BY子句,以及CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式.

修改序列

序列所有者可以将序列修改为alte r仅限INCREMENT BY值,MINVALUE,MAXVALUE,CYCLE或CACHE子句等属性.请注意,所做的更改将反映在即将到来的数字中.

语法:

 ALTER SEQUENCE [序列名称]  INCREMENT BY n  MAXVALUE n  NOCACHE  NOCYCLE


删除序列

DROP SEQUENCE命令删除需要重新创建或不再需要的序列.

 DROP SEQUENCE [序列名称]


索引

索引是用于调整SELECT查询性能的数据库对象.有不同类型的索引,包括用于强制执行主键约束的索引,唯一索引,非唯一索引和连接索引等.没有索引,查询将要求Oracle扫描表中的所有行,以便返回结果表所需的行.在表列上创建索引,然后存储表索引段下列的所有值.与序列,inde不同xes是特定于表的.它们会在删除表后自动删除.

可以自动或手动创建索引.当您指定PRIMARY KEY约束或UNIQUE约束时,Oracle将自动创建唯一索引以支持指定表的快速数据检索.

或者,用户可以手动创建索引以优化查询性能.手动创建的索引可以是唯一的也可以是非唯一的.非唯一索引可以是基于B树,位图或函数的索引.默认情况下, Oracle在列上创建B-Tree索引.这是语法

语法

 CREATE [UNIQUE] [BITMAP] INDEX index  ON table(column [,column] ...);


请注意,必须仅为唯一和位图索引指定UNIQUE和BITMAP.默认情况下, Oracle为普通索引创建B-Tree索引.

复合索引(也称为连接索引)是在表的多个列上创建的索引.复合索引中的列可以按任何顺序出现,并且不必是表中的相邻列.复合索引可增强查询的行检索速度,其中WHERE子句引用复合索引中列的全部或前导部分.索引最多可包含32列.

例如,用户在EMPLOYEES表的HIRE_DATE列上创建索引IDX_EMP.索引用法将通过遍历索引来减少磁盘I/O.路径扫描并查找在HIRE_DATE列上过滤的数据.

 CREATE INDEX IDX_EMP ON employees(hire_date);


删除索引

无法修改索引,但可以更改索引以进行分析,重建或统计计算.如果必须修改索引定义,则必须删除并重新创建索引.DROP INDEX命令的语法很简单.

 DROP INDEX index_name;


同义词

同义词是一个别名,也就是简化用于简化引用数据库对象任务的简写形式.这个概念类似于为朋友和熟人使用昵称.引用一个拥有的对象另一个用户需要架构n ame以它为前缀.在同义词的帮助下,您可以减少引用对象和模式名称的工作量.这样,同义词提供了位置透明性,因为同义词名称隐藏了实际的对象名称及其所有者.

有两类同义词,public和private.可以使用公共同义词来轻松访问所有系统用户的对象.实际上,创建公共同义词的个人不拥有同义词 - 而是属于Oracle中存在的PUBLIC用户组.另一方面,私有同义词属于创建它们的系统用户并驻留在该同义词中.用户的架构.

语法

CREATE [PUBLIC] SYNONYM [synonym name] FOR OBJECT;


系统用户可以授予使用他们拥有给其他系统用户的私有同义词的权限.为了创建同义词,您需要具有CREATE SYNONYM权限.此外,您必须具有CREATE PUBLIC SYNONYM权限以创建公共同义词.如果同义词声明为public,则同义词名称不能作为公共同义词使用.尝试创建已存在的公共同义词将导致CREATE PUBLIC SYNONYM命令失败,Oracle将返回ORA-00955:现有对象错误消息已使用名称.

插图

考虑两个用户U1和U2.U1可以访问EMPLOYEES表.因此,要在EMPLOYEES表上启用对U2的访问,也可以在U2架构中创建同义词.访问必须由U1授予U2.

CONN U2/U2SQL> CREATE SYNONYM EMP_SYNFOR U1.employees;CONN U1/U1SQL> GRANT ALL ON EMP_SYN TO U2;CONN U2/U2SQL> SELECT * FROM EMP_SYN;


删除同义词

你可以放弃它拥有的同义词.要删除公共同义词,您必须具有DROP PUBLIC SYNONYM权限.

 DROP SYNONYM EMP_SYN;