- 浏览: 278482 次
- 性别:
- 来自: 广州
-
最新评论
-
Yiwu_zh:
步骤清晰,跟着来做,真搭建好了
不过用的是10.5版本,输出有 ...
搭建简单的DB2 HADR -
luogen33:
db2备份单个表 -
gthao:
1 楼正解。。如果schema里面有内容的话,就删除不了,会报 ...
db2建立schema -
znttql:
整理的太好了 非常感谢啊
DB2 日期 时间 -
alvin198761:
能根据schame备份数据库不??
db2备份单个表
视图、同义词和序列
视图、同义词和序列是Oracle的常用对象,在Oracle系统安装完成后,就已经建立许多Oracle系统所用的视图、同义词和序列。此外,在应用系统设计中,也经常需要创建视图、同义词和序列来满足应用的需要。下面给出简要介绍。
§4.1 视图
视图的一个主要目的就是简化用于查询所使用的语句,另外就是可以实现安全和保密的目的。利用视图,我们可以在查询处理中完成复杂的操作。
§4.1.1 使用视图来修改表中数据
可以用视图修改表中数据:
l 带有集合操作,如 intersect, union和minus的视图;
l 带有 group by,connect by,或 start with子句的视图;
l 带有组合功能,如 avg , sum 或 max 功能的视图;
l 使用 distinct 功能的视图。
§4.1.2 创建一个新视图
1 建立视图命令语法:
CREATE [OR REPLACE] [FORCE/NO FORCE] VIEW [schema.]view
[column_name1, column_name2] AS query
[WITH OBJECT OID | DEFAULT]
[WITH CHECK OPTION]
[CONSTRAINT constraint]
[WITH READ ONLY]
OR REPLACE 替换掉原来的视图(不需删除)
FORCE 强行创建一视图,无论视图的基表是否存在或拥有者是
否有权限,但作select、insert、update、delete前条件
必须为真。
Schema 帐户、缺省为当前登录的帐户。
VIEW 视图名
Alias 视图的列名(唯一),缺省为列名
As subquery 查询表达式(不含order by, For update)
WITH CHECK OPTION 在视图上作insert,update时必须是视图,
查询所得到的结果,有子查询时可能不正确。
Constraint 约束名称,缺省为sys_Cn. N为整数(唯一)。
注:视图只是一个逻辑表,它自己不包含任何数据,目的在于:
l 通过限制存取基表中预定的一组行或列,提供安全的附加功能;
l 隐藏数据的复杂性,例如,经常对几个表的数据作某种运算后查询
时,可以使用视图使得操作仿佛是在单表上进行;
l 省去一些复杂的连接操作
==============================================================================
注意:下面情况在视图中受到限制:
l 视图查询不能选取Currval,nextval伪列;
l 只有加别名才能使用rowid,rownum,level;
l 如果在子查询中使用 * 代替选择的表的所有列,则后来该表新加的列不会自动被加到视图中,只有重新创建视图后该新增的列才能被加到视图中;
l 如果视图建立(即查询)时包括任何以下结构之一,则该视图不能作insert,update,delete(目前的新版可以,需作特别的说明限制):
连接运算;
集合运算符;
组函数;
GROUP BY,CONNECT BY,START WITH;
DISTINCT。
==============================================================================
提示:不要在视图中再建视图,理论上虽可以对视图再建视图,但这样在查询时影响速度。
Create view emp_vi as select * from emp;
例1:为表emp建立视图dept20,此视图可以显示部门20的雇员和他们
的年薪。
Create view dept10 As select ename,deptno,job, sal*12 sal12
From emp where deptno=10;
例2:
Create view clerk (id_number, person, depart, position )
As select empno,ename,deptno,job
From emp where job='clerk'
With check option constraint wco;
用户不能往clerk视图中作insert(或update)非'clerk'的记录。
§4.1.3 删除一个视图
1.用命令删除视图
语法:
DROP VIEW [SCHEMA.] view_name;
如
drop view view_data;
建议:一般视图不占用多少空间,可以不必删除。
2.用Schema Manager 删除视图
1)启动Schema Manager ,以DBA登录;
2)双击 View 文件夹,出现包含视图的模式列表;
3)双击包含要改变的视图的名字;
4)点击要被删除的视图名;
5)点红X;
6)在确定是否要删除中回答 Yes;
有关的数据字典user_views(dba_views, all_views) 视图:
Column Datatype NULL 说明
------------ ------------- ---------- ------------------
OWNER VARCHAR2(30) NOT NULL 视图创建者
VIEW_NAME VARCHAR2(30) NOT NULL 视图名
TEXT_LENGTH NUMBER 视图主体长度
TEXT LONG 视图内容
TYPE_TEXT_LENGTH NUMBER 类型文本长度
TYPE_TEXT VARCHAR2(4000) 视图的类型
OID_TEXT_LENGTH NUMBER OID 视图类型的长度
OID_TEXT VARCHAR2(4000) 视图类型的OID
VIEW_TYPE_OWNER VARCHAR2(30) 视图类型的所以者
VIEW_TYPE VARCHAR2(30) 视图类型
§4.1.4 改变视图
当视图的状态不可用('INVALID')时,需要用ALTER VIEW . . . COMPILE 对视图进行编译。如:
SQL>ALTER VIEW SCHEMA.view COMPILE;
你可以用下面语句查询那些无效的视图,然后有针对性地进行编译:
SQL> SELECT OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS FROM DBA_OBJECTS
WHERE object_type=’VIEW’ and STATUS='INVALID';
§4.2 实体视图(MATERIALIZED VIEW)
Oracle8i版本提供可以创建实体视图(MATERIALIZED VIEW),它确实存放有物理数据。实体视图包含定义视图的查询时所选择的基表中的行。在普通的视图中,Oracle在执行查询时临时进行查询操作来返回结果;而对实体视图的查询是直接从该视图中取出行。
在Oracle9i版本里,对实体视图进行了增强,如提供快速刷新等。下面简单介绍实体视图的使用。
§4.2.1 创建实体视图
1.关键内容:
使用实体视图需要了解下面几个关键点:
l 实体视图存放有物理数据;
l 实体视图背后的查询只在视图建立或刷新时执行,即如果创建后不进行刷新则只得到创建时的数据;
l 实体视图使用DBMS_MVIEW 程序包中含有刷新和管理实体视图的过程来进行管理;
l 在导出和导入(EXP、IMP)中使用MVDATA参数来实现实体视图数据的导出和导入;
l 使用CREATE MATERIALIZED VIEW 语句创建实体视图;
l 实体视图中的查询表叫主表(master tables)(复制项)或详细表(数据仓库项)。为一致起见,这些主表叫主数据库(master databases.);
l 为了复制目的,实体视图允许你在本地管理远程拷贝;
l 所复制的数据可以使用高级复制特性进行更新;
l 在复制环境下,通常创建的实体视图都是主键、ROWID和子查询实体视图。
2.创建实体视图前提:
l 要有授权创建实体视图的权限(CREATE MATERIALIZED VIEW 或CREATE SNAPSHOT);
l 必须有访问各个主表的权限,即有SELECT ANY TABLE 的系统权限。
如果在另外的用户模式下创建实体视图,则:
l 需要有CREATE ANY MATERIALIZED VIEW或CREATE ANY SNAPSHOT、SELECT ANY TABLE 权限;
l 必须有CREATE TABLE、SELECT ANY TABLE系统权限。
如果带查询重写有效来创建实体视图,则:
l 主表的主人必须有QUERY REWRITE系统权限;
l 如果你不是主表主人,则必须有GLOBAL QUERY REWRITE系统权限;
l 如果模式主人没有主表,则该模式主人必须有GLOBAL QUERY REWRITE权限。
3.创建实体视图语法:
下面给出Oracle9i版本的实体视图的创建语法:
CREATE MATERIALIZED VIEW [schema.] materializede_view
[ OF [schema .] object_type ]| [(scoped_table_ref_constraint)] |
ORGANIZATION_INDEX index_org_table_clause |
[
[
[ [segment_attribute_cluase|column_properties ] | [CACHE|NOCACHE ] ] |
[ CLUSTER cluster (column,) ]
]|
[partitioning_clause|parllel_cluse|build_clause] |
[
ON PREBUILT TABLE [ [WITH|WITHOUT] | REDUCED PRECISION ]
]|
[
[ USING INDEX [physical_attribute_clause |TABLESPACE tablespace] ] |
[ USING NO INDEX ]
] refresh_cluse
[ [ FOR UPDATE ] | [ DISABLE | ENABLE ] QUERY REWRITE ] ]
AS subquery;
其中:
scoped_table_ref_constraint为:
SCOPE FOR ( [ref_column|ref_attribute] ) IS [schema.] scpe_table_name
Index_org_table_clause为:
[ (mapping_table_clause) | PCTTHRESHOLD integer | [COMPRESS integer|NOCOMPRESS] ]
[ INCLUDING column_name ] OVERFLOW [ segment_attribute_clause]
refresh_clause 为:
[ NEVER REFRESH |
[ REFRESH | [ USING [ DEFAULT [LOCAL | MASTER] ROLLBACK SEGMENT ] |
[LOCAL | MASTER] ROLLBACK SEGMENT ] rollback_segment ]
| WITH [ PRIMARY KEY | ROWID ]
| NEXT [ START WITH ] date
| ON [ DEMAND | COMMIT ]
| [ FAST | COMPLETE|FORCE ]
]
参数说明:
schema 模式名
materialized_view实体视图名
segment_attributes_clause建立PCTFREE、PCTUSED、INITRANS和MAXTRANS 参数。
TABLESPACE 表空间
LOB_storage_clause大对象存储参数
LOGGING | NOLOGGING指定创建实体视图时是否需要建立日志
CACHE | NOCACHE 实体视图的数据是否被缓存
CLUSTER cluster名
partitioning_clauses用于指定实体视图的分区范围或一个HASH函数。实体视图分区与表分区类似。
parallel_clause 指定实体视图的并行操作和设置查询并行度。
build_clause 当移植实体视图时使用。
NOPARALLEL 指定顺序执行(缺省值),
PARALLEL 如果选择并行度时可指定并行。
THREADS_PER_CPU 初始参数
PARALLEL integer 指定并行度。
Build_clause 指定重建实体视图时的选项:
IMMEDIATE 指定为IMMEDIATE 表示实体视图是立即移植(缺省值)。
DEFERRED 指定为DEFERRED 表示实体视图是在下次刷新时移植。第一次延期总是一个完全的刷新。一直到被刷新为止该实体视图的值都是旧的值,所以它是不可查询重写的。
ON PREBUILT TABLE 此项可以使你以原初始化实体视图(preinitialized materialized view)来注册一个存在的表。这对于大表来说非常有用。它有下面限制:
l 每个列的别名必须与表的列名一样;
l 如果使用ON PREBULT TABLE,则不能对列再指定 NOT NULL。
WITH REDUCED PRECISION允许指定表或实体视图精度可以丢失。实体视图的列不能与子查询所返回的精度一致。
WITHOUT REDUCED PRECISION表示不允许指定表或实体视图精度可以丢失。实体视图的列要与子查询所返回的精度一致。这是缺省值。
USING INDEX 用此项可以为索引建立INITRANS、MAXTRANS及STORAGE参数。如果不指定本参数,则系统使用原索引。
限制:不能在USING INDEX字句里指定PCTUSED或PCTFREE参数。
refresh_clause 用于指定缺省方法、模式及Oracle刷新实体视图的次数。如果一个实体视图的主表被修改。则实体视图必须被更新才能反映当前的数据。这项可以实现指定时间表和刷新方法。
FAST 指定增量刷新方法,该刷新是根据主表的改变来进行。这种改变存储在任何一个实体视图的日志里或加载日志里。
即使还没有在主表下建立实体视图日志,也可以建立一个总和的实体视图。然而,如果你建立其它类型的实体视图时,CREATE 语句就会失败。除非实体视图日志已经存在。
如果在创建实体视图时存在适合的实体视图日志,Oracle将执行快速的刷新。
为了使DML改变和直接的加载都能有效,就要适当限制实体视图的刷新。
COMPLETE 指定刷新方法,如果指定了完全刷新,即使已经指定了快速刷新,Oracle也执行完全刷新。
FORCE 表示强行刷新。它是FAST、COMPLETE、FORCE三种刷新的缺省值。
4.创建实体例子:
例1.创建实体汇总视图:
下面语句建立一个移植的实体视图,并指定缺省的刷新方法、模式及时间:
CREATE MATERIALIZED VIEW mv1 REFRESH FAST ON COMMIT
BUILD IMMEDIATE
AS SELECT t.month, p.prod_name, SUM(f.sales) AS sum_sales
FROM time t, product p, fact f
WHERE f.curDate = t.curDate AND f.item = p.item
GROUP BY t.month, p.prod_name;
例2.创建实体汇总视图:
下面语句建立和移植一个实体视图sales_by_month_by_state,这个实体视图根据数据语句一旦执行成功就进行移植。接着就完成实体视图的查询:
CREATE MATERIALIZED VIEW sales_by_month_by_state
TABLESPACE my_ts PARALLEL (10)
ENABLE QUERY REWRITE
BUILD IMMEDIATE
REFRESH COMPLETE
AS SELECT t.month, g.state, SUM(f.sales) AS sum_sales
FROM fact f, time t, geog g
WHERE f.cur_date = t.cur_date AND f.city_id = g.city_id
GROUP BY month, state;
例3.原实体视图(即视图的名字与原来表名一样):
下面语句为先前存在的总结表sales_sum_table 建立汇总视图 sales_sum_table:
CREATE TABLE sales_sum_table
(month DATE, state VARCHAR2(25), sales NUMBER);
CREATE MATERIALIZED VIEW sales_sum_table
ON PREBUILT TABLE
ENABLE QUERY REWRITE
AS SELECT t.month, g.state, SUM(f.sales) AS sum_sales
FROM fact f, time t, geog g
WHERE f.cur_date = t.cur_date AND f.city_id = g.city_id
GROUP BY month, state;
在这个例子中,实体视图与先前建立的实体表有相同的名字、相同的列和数据类型。
例4.实体连接视图:
声明语句建立一个连接实体视图:
CREATE MATERIALIZED VIEW mjv
REFRESH FAST
AS SELECT l.rowid as l_rid, l.pk, l.ofk, l.c1, l.c2,
o.rowid as o_rid, o.pk, o.cfk, o.c1, o.c2,
c.rowid as c_rid, c.pd, c.c1, c.c2
FROM l, o, c
WHERE l.ofk = o.pk(+) AND o.ofk = c.pk(+);
例5.子查询实体视图:
下面语句创建一个基于Order 和 Customers 表的视图:
CREATE MATERIALIZED VIEW sales.orders FOR UPDATE
AS SELECT * FROM sales.orders@dbs1.acme.com o
WHERE EXISTS
(SELECT * FROM sales.customers@dbs1.acme.com c
WHERE o.c_id = c.c_id);
例6.主键的实体视图:
下面语句创建一个主键实体视图human_genome:
CREATE MATERIALIZED VIEW human_genome
REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/4096
WITH PRIMARY KEY
AS SELECT * FROM genome_catalog;
例7.ROWID实体视图:
下面语句创建一个ROWID实体视图emp_data:
CREATE MATERIALIZED VIEW emp_data REFRESH WITH ROWID
AS SELECT * FROM emp_table73;
例8.周期性刷新的实体视图:
下面语句创建一个主键实体视图emp_sf并根据在纽约的scott的职工表来移植数据:
CREATE MATERIALIZED VIEW emp_sf
PCTFREE 5 PCTUSED 60
TABLESPACE users
STORAGE (INITIAL 50K NEXT 50K)
REFRESH FAST NEXT sysdate + 7
AS SELECT * FROM scott.emp@ny;
此语句没有START WITH参数,所以Oracle使用SYSDATE来估计下次的自动刷新时间。Oracle执行首次刷新为7天后。
例9.自动刷新的实体视图:
下面语句创建一个复杂的实体视图all_emps,它查询DALLAS和BALTIMORE中的职工表:
CREATE MATERIALIZED VIEW all_emps
PCTFREE 5 PCTUSED 60
TABLESPACE users
STORAGE INITIAL 50K NEXT 50K
USING INDEX STORAGE (INITIAL 25K NEXT 25K)
REFRESH START WITH ROUND(SYSDATE + 1) + 11/24
NEXT NEXT_DAY(TRUNC(SYSDATE, ’MONDAY’) )+ 15/24
AS SELECT * FROM fran.emp@dallas
UNION
SELECT * FROM marco.emp@balt;
Oracle在早上11点自动刷新,接着就在周一的3点进行刷新。缺省刷新方法是FORCE,all_emps视图包含一个UNION,它是不支持快速刷新的,所以Oracle只能用完全(complete)刷新。
上面语句同样为实体视图建立存储特性:
l 第一个存储参数建立初始大小为50KB,下次大小也为50KB.
l 第二个存储参数(使用USING INDEX)建立初始大小为25KB,下次大小也为25KB.
例10.自回滚段的实体视图:
下面语句在远程建立带master_seg 回滚段的主键实体视图sales_emp,并用本地回滚段snap_seg来刷新实体视图:
CREATE MATERIALIZED VIEW sales_emp
REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 7
USING MASTER ROLLBACK SEGMENT master_seg
LOCAL ROLLBACK SEGMENT snap_seg
AS SELECT * FROM bar;
§4.2.2 创建实体视图日志
1.创建实体视图日志的目的
使用CREATE MATERIALIZED VIEW LOG语句可以创建实体视图日志。实体视图日志是一个包含有主表和实体视图的表。这些快照(snapshot)和实体视图(materialized view)其实都是同义词。它们都引用一个或多个包含查询结果的表,这些表可以是本地数据库或远程数据库的表。
DML的改变是由主表的数据组成的,Oracle在实体视图日志里存储那些改变行的描述,然后使用实体视图日志去刷新基于主表的实体视图,这个过程叫快速刷新。如果没有实体视图日志,Oracle必须重新执行实体视图查询,这个过程叫完全刷新。通常快速刷新要比完全刷新用的时间少。
一般,实体视图日志与模式中的主表放在一起。你需要为每个主表建立实体视图日志。因为Oracle 要使用这个实体视图日志来进行快速刷新。
2.要求
l 如果你拥有主表,则可以建立实体视图日志。
l 如果你为其他人建立实体视图日志,则必须有CREATE ANY TABLE 和 COMMENT ANY TABLE权限。
3.CREATE MATERIALIZED VIEW LOG语法
( 创建实体视图日志命令语法见《Oracle9i SQL Reference 》 ) p982
4.实体视图日志例子
例1.主键的例子:
下面语句在雇员表上建立实体视图日志:
CREATE MATERIALIZED VIEW LOG ON emp WITH PRIMARY KEY;
例2.建立仅包含更新行主键的实体视图日志
Oracle可以用实体视图日志在任何简单主键的实体视图中来执行一个快速刷新。下面语句建立一个只包含更新行主键的实体视图日志:
CREATE MATERIALIZED VIEW LOG ON emp
PCTFREE 5
TABLESPACE users
STORAGE (INITIAL 10K NEXT 10K);
下面语句建立一个只包含更新行主键的实体视图日志:
CREATE MATERIALIZED VIEW LOG ON sales WITH ROWID, PRIMARY KEY;
下面语句建立一个包含更新行主键和更新列ZIP的实体视图日志:
CREATE MATERIALIZED VIEW LOG ON address WITH (zip);
下面语句建立一个主表,然后建立一个带INCLUDING NEW VALUES的实体视图日志:
CREATE TABLE agg
(u NUMBER, a NUMBER, b NUMBER, c NUMBER, d NUMBER);
CREATE MATERIALIZED VIEW LOG ON agg
WITH ROWID (u,a,b,c,d)
INCLUDING NEW VALUES;
下面语句使用agg日志来建立实体视图:
CREATE MATERIALIZED VIEW sn0
REFRESH FAST ON COMMIT
AS SELECT SUM(b+c), COUNT(*), a, d, COUNT(b+c)
FROM agg
GROUP BY a,d;
§4.2.3 修改实体视图
1.修改实体视图目的
实体视图是Oracle的一个数据库对象。它包含有一个或多个表的查询结果。使用
ALTER MATERIALIZED VIEW 可以对已经存在的实体视图进行修改。修改方法如下:
l 修改存储特性;
l 修改刷新方法、模式及时间
l 改变实体视图的结构以使它有不同类型;
l 使查询重写有效。
2.修改实体视图命令语法
ALTER MATERIALIZED VIEW [schema.] materializede_view
[
[ physical_attributes_clause|
LOB_storage_clause[,...] |
Modify_LOB_storage_clause [,...]|
Partition_clause |
Parallel_clause |
[LOGGING|NOLOGGING] |
allocate_extent_clause |
[CACHE|NOCACHE ]
]|
[
alter_iot_cluse |
USING INDEX physical_attribute_clause |
MODIFY scoped_table_ref_constraint |
REBUILD |
Refresh_cluse
]|
[
[ DISABLE | ENABLE ] QUERY REWRITE |
COMPILE |
CONSIDER FRESH
]
详细见《Oracle9i SQL Reference》p502
3.修改实体视图例子
例1:
CREATE MATERIALIZED VIEW hq_emp
REFRESH COMPLETE
START WTIH SYSDATE NEXT SYSDATE +1/4096
AS SELECT * FROM hq_emp;
ALTER MATERIALIZED VIEW hq_emp
REFRESH FAST;
例2:修改下次刷新:
ALTER MATERIALIZED VIEW branch_emp
REFRESH NEXT SYSDATE+7;
例3:修改完全刷新:
ALTER MATERIALIZED VIEW sf_emp
REFRESH COMPLETE
START WITH TRUNC(SYSDATE+1) + 9/24
NEXT SYSDATE+7;
例4:使查询重写有效:
ALTER MATERIALIZED VIEW mv1
ENABLE QUERY REWRITE;
例5:使用回滚段:
ALTER MATERIALIZED VIEW inventory
REFRESH USING MASTER ROLLBACK SEGMENT master_seg;
ALTER MATERIALIZED VIEW sales
REFRESH USING DEFAULT MASTER ROLLBACK SEGMENT;
例6:使用主键:
ALTER MATERIALIZED VIEW emp_rs
REFRESH WITH PRIMARY KEY;
例7:使用完全刷新:
ALTER MATERIALIZED VIEW store_mv COMPILE;
例8:修改刷新方法:
ALTER MATERIALIZED VIEW store_mv REFRESH FAST;
例9:修改考虑刷新(CONSIDER FRESH)方法:
ALTER MATERIALIZED VIEW mv1 CONSIDER FRESH;
§4.2.4 修改实体视图日志
ALTER MATERIALIZED VIEW LOG
1.修改实体视图日志目的
使用 ALTER MATERIALIZED VIEW LOG 可以对已经存在的实体视图日志进行修改。可以修改存储特性、刷新模式、时间或已经存在实体视图日志的类型。
2.修改实体视图日志命令语法
( 创建实体视图日志命令语法见《Oracle9i SQL Reference 》 )
3.修改实体视图日志命令例子
例1:修改扩展次数:
ALTER MATERIALIZED VIEW LOG ON dept
STORAGE MAXEXTENTS 50;
例2:修改已经存在的ROWID:
ALTER MATERIALIZED VIEW LOG ON sales
ADD PRIMARY KEY;
§4.2.5 实体视图完整例子
要在应用中使用实体视图,除了要实体视图的语句外,还需要进行数据库实例的初始化参数。并重新启动数据库实例才能使所写的实体视图有效。下面是操作步骤:
1.修改实例初始化参数initsid.ora 有关参数
与实体视图有关的参数与数据库作业一样,都是job_queue_processes和job_queue_interval 。第1个参数是队列的进程数,一般要设大于 0 ;第2个参数是刷新间隔秒数。Oracle9i可以是小于1000的整数。例如在initora817.ora初始化中将该二参数设置为:
job_queue_processes = 2
job_queue_interval = 5
2.关闭实例和重启动实例
在Oracle8i版本,可用svrmgrl服务器实用程序来关闭和启动数据库实例;在Oracle9i版本可用SQL>CONNECT AS SYSDBA实现关闭和启动数据库实例。
3.运行实体视图
CREATE MATERIALIZED VIEW emp_stat
TABLESPACE users
STORAGE (INITIAL 8K NEXT 5K)
REFRESH FAST START WITH SYSDATE NEXT round(SYSDATE + 16/24)
AS SELECT deptno,sum(sal)
from emp group by deptno;
实体化视图已创建。
22:29:28 SQL> create materialized view log on emp pctfree 5 tablespace users;
实体化视图日志已创建。
SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 14116
20 54537
30 9400
SQL> alter materialized view emp_stat
2 refresh complete
3 start with trunc(sysdate)+15/24 next sysdate+30/24*60*60;
实体化视图已更改。
SQL>
SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 14116
20 64536
30 9400
修改下次刷新时间为下午3点半(start with trunc(sysdate)+15.5/24),则:
SQL> set time on
15:23:34 SQL> alter materialized view emp_stat
15:23:50 2 refresh complete
15:23:50 3 start with trunc(sysdate)+15.5/24 next sysdate+30/24*60*60;
实体化视图已更改。
现在虽然视图已更改,但由于没到时间。所以视图数据还是原来的旧数据:
15:27:05 SQL> /
DEPTNO SUM(SAL)
---------- ----------
10 14116
20 64536
30 9400
15:27:07 SQL>
15:27:07 SQL>
由于时间到了3点刷新点,可查出新的统计结果:
15:30:06 SQL> /
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 9400
15:30:09 SQL>
15:36:09 SQL> insert into emp values(555,'zhaojie','enginner',null,null,20000,5000,20);
已创建 1 行。
15:36:39 SQL> commit;
15:38:08 SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 9400
15:38:34 SQL>
每一小时一次则next 表达式为 sysdate+1*60分*60秒/24 * 60分* 60秒=next sysdate+1/24
每半小时一次 next sysdate + 30*60/60*60*24 = sysdate+1/48
每15分钟一次 next sysdate+1/96
希望刷新是4点半,接着是15分一次:
alter materialized view emp_stat
refresh complete
start with trunc(sysdate)+16.5/24 next sysdate+1/96;
16:10:49 SQL> alter materialized view emp_stat
16:13:29 2 refresh complete
16:13:29 3 start with trunc(sysdate)+16.5/24 next sysdate+1/96;
实体化视图已更改。
16:13:31 SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 9400
16:13:43 SQL>
16:30:20 SQL>/
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 19399
16:30:27 SQL>
16:30:27 SQL>
16:31:03 SQL> insert into emp values(555,'zhaojie','enginner',null,null,20000,5000,20);
已创建 1 行。
16:32:04 SQL> commit;
提交完成。
16:32:15 SQL>
希望在16:45时重新刷新。得到新结果,在时间到后,视图自动刷新,deptno=20的总和已改变:
16:46:22 SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 84536
30 19399
与实际表查出一样:
16:46:29 SQL> select deptno,sum(sal) from emp group by deptno;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 84536
30 19399
4.停止实体视图的自动运行
§4.3 序号(sequence)
序号是一个发布唯一数字的ORACLE 对象,在需要时,每次按1或一定增量增加。序号通常用于产生表中的唯一主键或唯一索引等。
§4.3.1 建立序号
建立序号可以在SQL*PLUS 中用命令来完成,也可以使用Schema Manager 工具来完成。
1. 命令语法:
CREATE SEQUENCE [user.]sequence
[INCREMENT BY {1|integer}]
[START WITH integer]
[MAXVALUE integer|NOMAXVALUE]
[MINVALUE integer|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE{20|integer}|NOCACHE]
[ORDER|NOORDER]
2. 建立序号
例1:建立Sequence
Create sequence emp_sequence
Increment by 1
Start with 1
No maxvalue
No cycle
Cache 10;
Create sequence order_seq
Start with 1
Incremant by 1
Nomaxvalue
Nocycle
Cache 20;
§4.3.2 修改序号
3. 修改序号
有时需要对已建立的序号进行修改,比如在系统移植或升级时可能有的序号已经增长到某个值。现在需要从原先停止的地方开始等。
例2:修改sequence
Alter sequence emp_sequence
Increment by 1
Maxvalue 10000
Cycle
Cache 20;
§4.3.3 使用序号
建立序号的目的就是使用序号,使用序号主要是在插入和查询时使用。
例3:使用sequence
insert into orders(orderno,custno)
values(order_seq.nextval,1032);
update orders set orderno-orderno=order_seq.nextval
where orderno=10112;
每使用一次,nextval自动增1,currval是多次使用的值,如果一开始就
用,则其值为0,一般情况下是在nextval使用之后才能使用currval,可以用它来产生同样的号,比如有一定货号有多种商品和数量:
insert into line items(orderno,partno,quantity)
values(order_seq.currval,20231,3);
insert into line_items(orderno,partno,quantity)
values(order_seq.currval,29374,1);
提示:在ORACLE8 中,如果在建立序列的语句中未加上NOCACHE,则有可能在关闭系统再启动后产生跳号现象。如果你的系统要求不许跳号,请在创建序列时在后面加 NOCACHE 。
§4.3.4 删除序号
当不再使用时就可以删除序号,删除序号有两种方法:
1. DROP SEQUENCE [Schema.]seguence_name;
2. 使用 Schema Manager 工具;
§4.4 同义词
同义词可以使多个用户使用同一个对象而不用将模式(Schema )作为前缀加在对象的前面,从而简化授权方面的操作。同义词有公有和私有两种。
§4.4.1 建立同义词
要建立同义词,首先要有Create any synonym和drop any synonym权限方可建立和撤消,如果某个用户不能建立同义词,则应给其授该权限。
CRAETE [PUBLIC] SYNONYM [user.]synonym
FOR [user.]table [@database_link];
例1:
Create public synonym emp
For scott.emp@sales;
例2:为当前用户的所有对象建立公共同义词,可用下面各命令来完成创建一个脚本:
set echo off
set head off
set verify off
set linesize 200
set pages 0
set feedback off
set term on
undefine p_user
def p_user = &&p_user
Prompt Generating Script To Drop User
set term off
SPOOL create_syn.sql
select 'drop public synonym '||object_name||' ;' from user_objects;
select ' create public synonym '||object_name||
' for sale.'||object_name||' ;' from user_objects;
SPOOL OFF
Start create_syn.sql
注意:当创建同义词后,还要将该同义词授权给public ,才能使其他的Oracle用户可以访问该同义词。
同义词数据字典:
DBA_SYNONYMS实例中所有同义词
USER_SYNONYMS(=SYN)用户的同义词
§4.4.2 删除同义词
DROP PUBLIC synonym [schema.]synonym ;
Drop synonym emp;
例1:为当前所有对象建立同义词。为了省去编辑,可用下面个命令来完成:
* 需具有 dba, -- create any synonym,drop any synonym 权限
select 'drop public synonym '||object_name||' ;' from user_objects;
select ' create public synonym '||object_name||
' for sale.'||object_name||' ;' from user_objects;
§4.5 视图、同义词和序列有关的数据字典
当我们创建了视图、同义词和序列后,相关的信息就被记录到Oracle的数据字典中,作为程序人员和数据库管理员,应该了解有关数据字典的基本查询方法.
与视图、同义词和序列有关的数据字典有:
l DBA_VIEWS –实例中所有的视图的基本信息;
l DBA_SYNONYMS –实例中所有的同义词;
l DBA_SEQUENCES –实例中所有的序列。
视图、同义词和序列是Oracle的常用对象,在Oracle系统安装完成后,就已经建立许多Oracle系统所用的视图、同义词和序列。此外,在应用系统设计中,也经常需要创建视图、同义词和序列来满足应用的需要。下面给出简要介绍。
§4.1 视图
视图的一个主要目的就是简化用于查询所使用的语句,另外就是可以实现安全和保密的目的。利用视图,我们可以在查询处理中完成复杂的操作。
§4.1.1 使用视图来修改表中数据
可以用视图修改表中数据:
l 带有集合操作,如 intersect, union和minus的视图;
l 带有 group by,connect by,或 start with子句的视图;
l 带有组合功能,如 avg , sum 或 max 功能的视图;
l 使用 distinct 功能的视图。
§4.1.2 创建一个新视图
1 建立视图命令语法:
CREATE [OR REPLACE] [FORCE/NO FORCE] VIEW [schema.]view
[column_name1, column_name2] AS query
[WITH OBJECT OID | DEFAULT]
[WITH CHECK OPTION]
[CONSTRAINT constraint]
[WITH READ ONLY]
OR REPLACE 替换掉原来的视图(不需删除)
FORCE 强行创建一视图,无论视图的基表是否存在或拥有者是
否有权限,但作select、insert、update、delete前条件
必须为真。
Schema 帐户、缺省为当前登录的帐户。
VIEW 视图名
Alias 视图的列名(唯一),缺省为列名
As subquery 查询表达式(不含order by, For update)
WITH CHECK OPTION 在视图上作insert,update时必须是视图,
查询所得到的结果,有子查询时可能不正确。
Constraint 约束名称,缺省为sys_Cn. N为整数(唯一)。
注:视图只是一个逻辑表,它自己不包含任何数据,目的在于:
l 通过限制存取基表中预定的一组行或列,提供安全的附加功能;
l 隐藏数据的复杂性,例如,经常对几个表的数据作某种运算后查询
时,可以使用视图使得操作仿佛是在单表上进行;
l 省去一些复杂的连接操作
==============================================================================
注意:下面情况在视图中受到限制:
l 视图查询不能选取Currval,nextval伪列;
l 只有加别名才能使用rowid,rownum,level;
l 如果在子查询中使用 * 代替选择的表的所有列,则后来该表新加的列不会自动被加到视图中,只有重新创建视图后该新增的列才能被加到视图中;
l 如果视图建立(即查询)时包括任何以下结构之一,则该视图不能作insert,update,delete(目前的新版可以,需作特别的说明限制):
连接运算;
集合运算符;
组函数;
GROUP BY,CONNECT BY,START WITH;
DISTINCT。
==============================================================================
提示:不要在视图中再建视图,理论上虽可以对视图再建视图,但这样在查询时影响速度。
Create view emp_vi as select * from emp;
例1:为表emp建立视图dept20,此视图可以显示部门20的雇员和他们
的年薪。
Create view dept10 As select ename,deptno,job, sal*12 sal12
From emp where deptno=10;
例2:
Create view clerk (id_number, person, depart, position )
As select empno,ename,deptno,job
From emp where job='clerk'
With check option constraint wco;
用户不能往clerk视图中作insert(或update)非'clerk'的记录。
§4.1.3 删除一个视图
1.用命令删除视图
语法:
DROP VIEW [SCHEMA.] view_name;
如
drop view view_data;
建议:一般视图不占用多少空间,可以不必删除。
2.用Schema Manager 删除视图
1)启动Schema Manager ,以DBA登录;
2)双击 View 文件夹,出现包含视图的模式列表;
3)双击包含要改变的视图的名字;
4)点击要被删除的视图名;
5)点红X;
6)在确定是否要删除中回答 Yes;
有关的数据字典user_views(dba_views, all_views) 视图:
Column Datatype NULL 说明
------------ ------------- ---------- ------------------
OWNER VARCHAR2(30) NOT NULL 视图创建者
VIEW_NAME VARCHAR2(30) NOT NULL 视图名
TEXT_LENGTH NUMBER 视图主体长度
TEXT LONG 视图内容
TYPE_TEXT_LENGTH NUMBER 类型文本长度
TYPE_TEXT VARCHAR2(4000) 视图的类型
OID_TEXT_LENGTH NUMBER OID 视图类型的长度
OID_TEXT VARCHAR2(4000) 视图类型的OID
VIEW_TYPE_OWNER VARCHAR2(30) 视图类型的所以者
VIEW_TYPE VARCHAR2(30) 视图类型
§4.1.4 改变视图
当视图的状态不可用('INVALID')时,需要用ALTER VIEW . . . COMPILE 对视图进行编译。如:
SQL>ALTER VIEW SCHEMA.view COMPILE;
你可以用下面语句查询那些无效的视图,然后有针对性地进行编译:
SQL> SELECT OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS FROM DBA_OBJECTS
WHERE object_type=’VIEW’ and STATUS='INVALID';
§4.2 实体视图(MATERIALIZED VIEW)
Oracle8i版本提供可以创建实体视图(MATERIALIZED VIEW),它确实存放有物理数据。实体视图包含定义视图的查询时所选择的基表中的行。在普通的视图中,Oracle在执行查询时临时进行查询操作来返回结果;而对实体视图的查询是直接从该视图中取出行。
在Oracle9i版本里,对实体视图进行了增强,如提供快速刷新等。下面简单介绍实体视图的使用。
§4.2.1 创建实体视图
1.关键内容:
使用实体视图需要了解下面几个关键点:
l 实体视图存放有物理数据;
l 实体视图背后的查询只在视图建立或刷新时执行,即如果创建后不进行刷新则只得到创建时的数据;
l 实体视图使用DBMS_MVIEW 程序包中含有刷新和管理实体视图的过程来进行管理;
l 在导出和导入(EXP、IMP)中使用MVDATA参数来实现实体视图数据的导出和导入;
l 使用CREATE MATERIALIZED VIEW 语句创建实体视图;
l 实体视图中的查询表叫主表(master tables)(复制项)或详细表(数据仓库项)。为一致起见,这些主表叫主数据库(master databases.);
l 为了复制目的,实体视图允许你在本地管理远程拷贝;
l 所复制的数据可以使用高级复制特性进行更新;
l 在复制环境下,通常创建的实体视图都是主键、ROWID和子查询实体视图。
2.创建实体视图前提:
l 要有授权创建实体视图的权限(CREATE MATERIALIZED VIEW 或CREATE SNAPSHOT);
l 必须有访问各个主表的权限,即有SELECT ANY TABLE 的系统权限。
如果在另外的用户模式下创建实体视图,则:
l 需要有CREATE ANY MATERIALIZED VIEW或CREATE ANY SNAPSHOT、SELECT ANY TABLE 权限;
l 必须有CREATE TABLE、SELECT ANY TABLE系统权限。
如果带查询重写有效来创建实体视图,则:
l 主表的主人必须有QUERY REWRITE系统权限;
l 如果你不是主表主人,则必须有GLOBAL QUERY REWRITE系统权限;
l 如果模式主人没有主表,则该模式主人必须有GLOBAL QUERY REWRITE权限。
3.创建实体视图语法:
下面给出Oracle9i版本的实体视图的创建语法:
CREATE MATERIALIZED VIEW [schema.] materializede_view
[ OF [schema .] object_type ]| [(scoped_table_ref_constraint)] |
ORGANIZATION_INDEX index_org_table_clause |
[
[
[ [segment_attribute_cluase|column_properties ] | [CACHE|NOCACHE ] ] |
[ CLUSTER cluster (column,) ]
]|
[partitioning_clause|parllel_cluse|build_clause] |
[
ON PREBUILT TABLE [ [WITH|WITHOUT] | REDUCED PRECISION ]
]|
[
[ USING INDEX [physical_attribute_clause |TABLESPACE tablespace] ] |
[ USING NO INDEX ]
] refresh_cluse
[ [ FOR UPDATE ] | [ DISABLE | ENABLE ] QUERY REWRITE ] ]
AS subquery;
其中:
scoped_table_ref_constraint为:
SCOPE FOR ( [ref_column|ref_attribute] ) IS [schema.] scpe_table_name
Index_org_table_clause为:
[ (mapping_table_clause) | PCTTHRESHOLD integer | [COMPRESS integer|NOCOMPRESS] ]
[ INCLUDING column_name ] OVERFLOW [ segment_attribute_clause]
refresh_clause 为:
[ NEVER REFRESH |
[ REFRESH | [ USING [ DEFAULT [LOCAL | MASTER] ROLLBACK SEGMENT ] |
[LOCAL | MASTER] ROLLBACK SEGMENT ] rollback_segment ]
| WITH [ PRIMARY KEY | ROWID ]
| NEXT [ START WITH ] date
| ON [ DEMAND | COMMIT ]
| [ FAST | COMPLETE|FORCE ]
]
参数说明:
schema 模式名
materialized_view实体视图名
segment_attributes_clause建立PCTFREE、PCTUSED、INITRANS和MAXTRANS 参数。
TABLESPACE 表空间
LOB_storage_clause大对象存储参数
LOGGING | NOLOGGING指定创建实体视图时是否需要建立日志
CACHE | NOCACHE 实体视图的数据是否被缓存
CLUSTER cluster名
partitioning_clauses用于指定实体视图的分区范围或一个HASH函数。实体视图分区与表分区类似。
parallel_clause 指定实体视图的并行操作和设置查询并行度。
build_clause 当移植实体视图时使用。
NOPARALLEL 指定顺序执行(缺省值),
PARALLEL 如果选择并行度时可指定并行。
THREADS_PER_CPU 初始参数
PARALLEL integer 指定并行度。
Build_clause 指定重建实体视图时的选项:
IMMEDIATE 指定为IMMEDIATE 表示实体视图是立即移植(缺省值)。
DEFERRED 指定为DEFERRED 表示实体视图是在下次刷新时移植。第一次延期总是一个完全的刷新。一直到被刷新为止该实体视图的值都是旧的值,所以它是不可查询重写的。
ON PREBUILT TABLE 此项可以使你以原初始化实体视图(preinitialized materialized view)来注册一个存在的表。这对于大表来说非常有用。它有下面限制:
l 每个列的别名必须与表的列名一样;
l 如果使用ON PREBULT TABLE,则不能对列再指定 NOT NULL。
WITH REDUCED PRECISION允许指定表或实体视图精度可以丢失。实体视图的列不能与子查询所返回的精度一致。
WITHOUT REDUCED PRECISION表示不允许指定表或实体视图精度可以丢失。实体视图的列要与子查询所返回的精度一致。这是缺省值。
USING INDEX 用此项可以为索引建立INITRANS、MAXTRANS及STORAGE参数。如果不指定本参数,则系统使用原索引。
限制:不能在USING INDEX字句里指定PCTUSED或PCTFREE参数。
refresh_clause 用于指定缺省方法、模式及Oracle刷新实体视图的次数。如果一个实体视图的主表被修改。则实体视图必须被更新才能反映当前的数据。这项可以实现指定时间表和刷新方法。
FAST 指定增量刷新方法,该刷新是根据主表的改变来进行。这种改变存储在任何一个实体视图的日志里或加载日志里。
即使还没有在主表下建立实体视图日志,也可以建立一个总和的实体视图。然而,如果你建立其它类型的实体视图时,CREATE 语句就会失败。除非实体视图日志已经存在。
如果在创建实体视图时存在适合的实体视图日志,Oracle将执行快速的刷新。
为了使DML改变和直接的加载都能有效,就要适当限制实体视图的刷新。
COMPLETE 指定刷新方法,如果指定了完全刷新,即使已经指定了快速刷新,Oracle也执行完全刷新。
FORCE 表示强行刷新。它是FAST、COMPLETE、FORCE三种刷新的缺省值。
4.创建实体例子:
例1.创建实体汇总视图:
下面语句建立一个移植的实体视图,并指定缺省的刷新方法、模式及时间:
CREATE MATERIALIZED VIEW mv1 REFRESH FAST ON COMMIT
BUILD IMMEDIATE
AS SELECT t.month, p.prod_name, SUM(f.sales) AS sum_sales
FROM time t, product p, fact f
WHERE f.curDate = t.curDate AND f.item = p.item
GROUP BY t.month, p.prod_name;
例2.创建实体汇总视图:
下面语句建立和移植一个实体视图sales_by_month_by_state,这个实体视图根据数据语句一旦执行成功就进行移植。接着就完成实体视图的查询:
CREATE MATERIALIZED VIEW sales_by_month_by_state
TABLESPACE my_ts PARALLEL (10)
ENABLE QUERY REWRITE
BUILD IMMEDIATE
REFRESH COMPLETE
AS SELECT t.month, g.state, SUM(f.sales) AS sum_sales
FROM fact f, time t, geog g
WHERE f.cur_date = t.cur_date AND f.city_id = g.city_id
GROUP BY month, state;
例3.原实体视图(即视图的名字与原来表名一样):
下面语句为先前存在的总结表sales_sum_table 建立汇总视图 sales_sum_table:
CREATE TABLE sales_sum_table
(month DATE, state VARCHAR2(25), sales NUMBER);
CREATE MATERIALIZED VIEW sales_sum_table
ON PREBUILT TABLE
ENABLE QUERY REWRITE
AS SELECT t.month, g.state, SUM(f.sales) AS sum_sales
FROM fact f, time t, geog g
WHERE f.cur_date = t.cur_date AND f.city_id = g.city_id
GROUP BY month, state;
在这个例子中,实体视图与先前建立的实体表有相同的名字、相同的列和数据类型。
例4.实体连接视图:
声明语句建立一个连接实体视图:
CREATE MATERIALIZED VIEW mjv
REFRESH FAST
AS SELECT l.rowid as l_rid, l.pk, l.ofk, l.c1, l.c2,
o.rowid as o_rid, o.pk, o.cfk, o.c1, o.c2,
c.rowid as c_rid, c.pd, c.c1, c.c2
FROM l, o, c
WHERE l.ofk = o.pk(+) AND o.ofk = c.pk(+);
例5.子查询实体视图:
下面语句创建一个基于Order 和 Customers 表的视图:
CREATE MATERIALIZED VIEW sales.orders FOR UPDATE
AS SELECT * FROM sales.orders@dbs1.acme.com o
WHERE EXISTS
(SELECT * FROM sales.customers@dbs1.acme.com c
WHERE o.c_id = c.c_id);
例6.主键的实体视图:
下面语句创建一个主键实体视图human_genome:
CREATE MATERIALIZED VIEW human_genome
REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/4096
WITH PRIMARY KEY
AS SELECT * FROM genome_catalog;
例7.ROWID实体视图:
下面语句创建一个ROWID实体视图emp_data:
CREATE MATERIALIZED VIEW emp_data REFRESH WITH ROWID
AS SELECT * FROM emp_table73;
例8.周期性刷新的实体视图:
下面语句创建一个主键实体视图emp_sf并根据在纽约的scott的职工表来移植数据:
CREATE MATERIALIZED VIEW emp_sf
PCTFREE 5 PCTUSED 60
TABLESPACE users
STORAGE (INITIAL 50K NEXT 50K)
REFRESH FAST NEXT sysdate + 7
AS SELECT * FROM scott.emp@ny;
此语句没有START WITH参数,所以Oracle使用SYSDATE来估计下次的自动刷新时间。Oracle执行首次刷新为7天后。
例9.自动刷新的实体视图:
下面语句创建一个复杂的实体视图all_emps,它查询DALLAS和BALTIMORE中的职工表:
CREATE MATERIALIZED VIEW all_emps
PCTFREE 5 PCTUSED 60
TABLESPACE users
STORAGE INITIAL 50K NEXT 50K
USING INDEX STORAGE (INITIAL 25K NEXT 25K)
REFRESH START WITH ROUND(SYSDATE + 1) + 11/24
NEXT NEXT_DAY(TRUNC(SYSDATE, ’MONDAY’) )+ 15/24
AS SELECT * FROM fran.emp@dallas
UNION
SELECT * FROM marco.emp@balt;
Oracle在早上11点自动刷新,接着就在周一的3点进行刷新。缺省刷新方法是FORCE,all_emps视图包含一个UNION,它是不支持快速刷新的,所以Oracle只能用完全(complete)刷新。
上面语句同样为实体视图建立存储特性:
l 第一个存储参数建立初始大小为50KB,下次大小也为50KB.
l 第二个存储参数(使用USING INDEX)建立初始大小为25KB,下次大小也为25KB.
例10.自回滚段的实体视图:
下面语句在远程建立带master_seg 回滚段的主键实体视图sales_emp,并用本地回滚段snap_seg来刷新实体视图:
CREATE MATERIALIZED VIEW sales_emp
REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 7
USING MASTER ROLLBACK SEGMENT master_seg
LOCAL ROLLBACK SEGMENT snap_seg
AS SELECT * FROM bar;
§4.2.2 创建实体视图日志
1.创建实体视图日志的目的
使用CREATE MATERIALIZED VIEW LOG语句可以创建实体视图日志。实体视图日志是一个包含有主表和实体视图的表。这些快照(snapshot)和实体视图(materialized view)其实都是同义词。它们都引用一个或多个包含查询结果的表,这些表可以是本地数据库或远程数据库的表。
DML的改变是由主表的数据组成的,Oracle在实体视图日志里存储那些改变行的描述,然后使用实体视图日志去刷新基于主表的实体视图,这个过程叫快速刷新。如果没有实体视图日志,Oracle必须重新执行实体视图查询,这个过程叫完全刷新。通常快速刷新要比完全刷新用的时间少。
一般,实体视图日志与模式中的主表放在一起。你需要为每个主表建立实体视图日志。因为Oracle 要使用这个实体视图日志来进行快速刷新。
2.要求
l 如果你拥有主表,则可以建立实体视图日志。
l 如果你为其他人建立实体视图日志,则必须有CREATE ANY TABLE 和 COMMENT ANY TABLE权限。
3.CREATE MATERIALIZED VIEW LOG语法
( 创建实体视图日志命令语法见《Oracle9i SQL Reference 》 ) p982
4.实体视图日志例子
例1.主键的例子:
下面语句在雇员表上建立实体视图日志:
CREATE MATERIALIZED VIEW LOG ON emp WITH PRIMARY KEY;
例2.建立仅包含更新行主键的实体视图日志
Oracle可以用实体视图日志在任何简单主键的实体视图中来执行一个快速刷新。下面语句建立一个只包含更新行主键的实体视图日志:
CREATE MATERIALIZED VIEW LOG ON emp
PCTFREE 5
TABLESPACE users
STORAGE (INITIAL 10K NEXT 10K);
下面语句建立一个只包含更新行主键的实体视图日志:
CREATE MATERIALIZED VIEW LOG ON sales WITH ROWID, PRIMARY KEY;
下面语句建立一个包含更新行主键和更新列ZIP的实体视图日志:
CREATE MATERIALIZED VIEW LOG ON address WITH (zip);
下面语句建立一个主表,然后建立一个带INCLUDING NEW VALUES的实体视图日志:
CREATE TABLE agg
(u NUMBER, a NUMBER, b NUMBER, c NUMBER, d NUMBER);
CREATE MATERIALIZED VIEW LOG ON agg
WITH ROWID (u,a,b,c,d)
INCLUDING NEW VALUES;
下面语句使用agg日志来建立实体视图:
CREATE MATERIALIZED VIEW sn0
REFRESH FAST ON COMMIT
AS SELECT SUM(b+c), COUNT(*), a, d, COUNT(b+c)
FROM agg
GROUP BY a,d;
§4.2.3 修改实体视图
1.修改实体视图目的
实体视图是Oracle的一个数据库对象。它包含有一个或多个表的查询结果。使用
ALTER MATERIALIZED VIEW 可以对已经存在的实体视图进行修改。修改方法如下:
l 修改存储特性;
l 修改刷新方法、模式及时间
l 改变实体视图的结构以使它有不同类型;
l 使查询重写有效。
2.修改实体视图命令语法
ALTER MATERIALIZED VIEW [schema.] materializede_view
[
[ physical_attributes_clause|
LOB_storage_clause[,...] |
Modify_LOB_storage_clause [,...]|
Partition_clause |
Parallel_clause |
[LOGGING|NOLOGGING] |
allocate_extent_clause |
[CACHE|NOCACHE ]
]|
[
alter_iot_cluse |
USING INDEX physical_attribute_clause |
MODIFY scoped_table_ref_constraint |
REBUILD |
Refresh_cluse
]|
[
[ DISABLE | ENABLE ] QUERY REWRITE |
COMPILE |
CONSIDER FRESH
]
详细见《Oracle9i SQL Reference》p502
3.修改实体视图例子
例1:
CREATE MATERIALIZED VIEW hq_emp
REFRESH COMPLETE
START WTIH SYSDATE NEXT SYSDATE +1/4096
AS SELECT * FROM hq_emp;
ALTER MATERIALIZED VIEW hq_emp
REFRESH FAST;
例2:修改下次刷新:
ALTER MATERIALIZED VIEW branch_emp
REFRESH NEXT SYSDATE+7;
例3:修改完全刷新:
ALTER MATERIALIZED VIEW sf_emp
REFRESH COMPLETE
START WITH TRUNC(SYSDATE+1) + 9/24
NEXT SYSDATE+7;
例4:使查询重写有效:
ALTER MATERIALIZED VIEW mv1
ENABLE QUERY REWRITE;
例5:使用回滚段:
ALTER MATERIALIZED VIEW inventory
REFRESH USING MASTER ROLLBACK SEGMENT master_seg;
ALTER MATERIALIZED VIEW sales
REFRESH USING DEFAULT MASTER ROLLBACK SEGMENT;
例6:使用主键:
ALTER MATERIALIZED VIEW emp_rs
REFRESH WITH PRIMARY KEY;
例7:使用完全刷新:
ALTER MATERIALIZED VIEW store_mv COMPILE;
例8:修改刷新方法:
ALTER MATERIALIZED VIEW store_mv REFRESH FAST;
例9:修改考虑刷新(CONSIDER FRESH)方法:
ALTER MATERIALIZED VIEW mv1 CONSIDER FRESH;
§4.2.4 修改实体视图日志
ALTER MATERIALIZED VIEW LOG
1.修改实体视图日志目的
使用 ALTER MATERIALIZED VIEW LOG 可以对已经存在的实体视图日志进行修改。可以修改存储特性、刷新模式、时间或已经存在实体视图日志的类型。
2.修改实体视图日志命令语法
( 创建实体视图日志命令语法见《Oracle9i SQL Reference 》 )
3.修改实体视图日志命令例子
例1:修改扩展次数:
ALTER MATERIALIZED VIEW LOG ON dept
STORAGE MAXEXTENTS 50;
例2:修改已经存在的ROWID:
ALTER MATERIALIZED VIEW LOG ON sales
ADD PRIMARY KEY;
§4.2.5 实体视图完整例子
要在应用中使用实体视图,除了要实体视图的语句外,还需要进行数据库实例的初始化参数。并重新启动数据库实例才能使所写的实体视图有效。下面是操作步骤:
1.修改实例初始化参数initsid.ora 有关参数
与实体视图有关的参数与数据库作业一样,都是job_queue_processes和job_queue_interval 。第1个参数是队列的进程数,一般要设大于 0 ;第2个参数是刷新间隔秒数。Oracle9i可以是小于1000的整数。例如在initora817.ora初始化中将该二参数设置为:
job_queue_processes = 2
job_queue_interval = 5
2.关闭实例和重启动实例
在Oracle8i版本,可用svrmgrl服务器实用程序来关闭和启动数据库实例;在Oracle9i版本可用SQL>CONNECT AS SYSDBA实现关闭和启动数据库实例。
3.运行实体视图
CREATE MATERIALIZED VIEW emp_stat
TABLESPACE users
STORAGE (INITIAL 8K NEXT 5K)
REFRESH FAST START WITH SYSDATE NEXT round(SYSDATE + 16/24)
AS SELECT deptno,sum(sal)
from emp group by deptno;
实体化视图已创建。
22:29:28 SQL> create materialized view log on emp pctfree 5 tablespace users;
实体化视图日志已创建。
SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 14116
20 54537
30 9400
SQL> alter materialized view emp_stat
2 refresh complete
3 start with trunc(sysdate)+15/24 next sysdate+30/24*60*60;
实体化视图已更改。
SQL>
SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 14116
20 64536
30 9400
修改下次刷新时间为下午3点半(start with trunc(sysdate)+15.5/24),则:
SQL> set time on
15:23:34 SQL> alter materialized view emp_stat
15:23:50 2 refresh complete
15:23:50 3 start with trunc(sysdate)+15.5/24 next sysdate+30/24*60*60;
实体化视图已更改。
现在虽然视图已更改,但由于没到时间。所以视图数据还是原来的旧数据:
15:27:05 SQL> /
DEPTNO SUM(SAL)
---------- ----------
10 14116
20 64536
30 9400
15:27:07 SQL>
15:27:07 SQL>
由于时间到了3点刷新点,可查出新的统计结果:
15:30:06 SQL> /
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 9400
15:30:09 SQL>
15:36:09 SQL> insert into emp values(555,'zhaojie','enginner',null,null,20000,5000,20);
已创建 1 行。
15:36:39 SQL> commit;
15:38:08 SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 9400
15:38:34 SQL>
每一小时一次则next 表达式为 sysdate+1*60分*60秒/24 * 60分* 60秒=next sysdate+1/24
每半小时一次 next sysdate + 30*60/60*60*24 = sysdate+1/48
每15分钟一次 next sysdate+1/96
希望刷新是4点半,接着是15分一次:
alter materialized view emp_stat
refresh complete
start with trunc(sysdate)+16.5/24 next sysdate+1/96;
16:10:49 SQL> alter materialized view emp_stat
16:13:29 2 refresh complete
16:13:29 3 start with trunc(sysdate)+16.5/24 next sysdate+1/96;
实体化视图已更改。
16:13:31 SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 9400
16:13:43 SQL>
16:30:20 SQL>/
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 64536
30 19399
16:30:27 SQL>
16:30:27 SQL>
16:31:03 SQL> insert into emp values(555,'zhaojie','enginner',null,null,20000,5000,20);
已创建 1 行。
16:32:04 SQL> commit;
提交完成。
16:32:15 SQL>
希望在16:45时重新刷新。得到新结果,在时间到后,视图自动刷新,deptno=20的总和已改变:
16:46:22 SQL> select * from emp_stat;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 84536
30 19399
与实际表查出一样:
16:46:29 SQL> select deptno,sum(sal) from emp group by deptno;
DEPTNO SUM(SAL)
---------- ----------
10 24115
20 84536
30 19399
4.停止实体视图的自动运行
§4.3 序号(sequence)
序号是一个发布唯一数字的ORACLE 对象,在需要时,每次按1或一定增量增加。序号通常用于产生表中的唯一主键或唯一索引等。
§4.3.1 建立序号
建立序号可以在SQL*PLUS 中用命令来完成,也可以使用Schema Manager 工具来完成。
1. 命令语法:
CREATE SEQUENCE [user.]sequence
[INCREMENT BY {1|integer}]
[START WITH integer]
[MAXVALUE integer|NOMAXVALUE]
[MINVALUE integer|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE{20|integer}|NOCACHE]
[ORDER|NOORDER]
2. 建立序号
例1:建立Sequence
Create sequence emp_sequence
Increment by 1
Start with 1
No maxvalue
No cycle
Cache 10;
Create sequence order_seq
Start with 1
Incremant by 1
Nomaxvalue
Nocycle
Cache 20;
§4.3.2 修改序号
3. 修改序号
有时需要对已建立的序号进行修改,比如在系统移植或升级时可能有的序号已经增长到某个值。现在需要从原先停止的地方开始等。
例2:修改sequence
Alter sequence emp_sequence
Increment by 1
Maxvalue 10000
Cycle
Cache 20;
§4.3.3 使用序号
建立序号的目的就是使用序号,使用序号主要是在插入和查询时使用。
例3:使用sequence
insert into orders(orderno,custno)
values(order_seq.nextval,1032);
update orders set orderno-orderno=order_seq.nextval
where orderno=10112;
每使用一次,nextval自动增1,currval是多次使用的值,如果一开始就
用,则其值为0,一般情况下是在nextval使用之后才能使用currval,可以用它来产生同样的号,比如有一定货号有多种商品和数量:
insert into line items(orderno,partno,quantity)
values(order_seq.currval,20231,3);
insert into line_items(orderno,partno,quantity)
values(order_seq.currval,29374,1);
提示:在ORACLE8 中,如果在建立序列的语句中未加上NOCACHE,则有可能在关闭系统再启动后产生跳号现象。如果你的系统要求不许跳号,请在创建序列时在后面加 NOCACHE 。
§4.3.4 删除序号
当不再使用时就可以删除序号,删除序号有两种方法:
1. DROP SEQUENCE [Schema.]seguence_name;
2. 使用 Schema Manager 工具;
§4.4 同义词
同义词可以使多个用户使用同一个对象而不用将模式(Schema )作为前缀加在对象的前面,从而简化授权方面的操作。同义词有公有和私有两种。
§4.4.1 建立同义词
要建立同义词,首先要有Create any synonym和drop any synonym权限方可建立和撤消,如果某个用户不能建立同义词,则应给其授该权限。
CRAETE [PUBLIC] SYNONYM [user.]synonym
FOR [user.]table [@database_link];
例1:
Create public synonym emp
For scott.emp@sales;
例2:为当前用户的所有对象建立公共同义词,可用下面各命令来完成创建一个脚本:
set echo off
set head off
set verify off
set linesize 200
set pages 0
set feedback off
set term on
undefine p_user
def p_user = &&p_user
Prompt Generating Script To Drop User
set term off
SPOOL create_syn.sql
select 'drop public synonym '||object_name||' ;' from user_objects;
select ' create public synonym '||object_name||
' for sale.'||object_name||' ;' from user_objects;
SPOOL OFF
Start create_syn.sql
注意:当创建同义词后,还要将该同义词授权给public ,才能使其他的Oracle用户可以访问该同义词。
同义词数据字典:
DBA_SYNONYMS实例中所有同义词
USER_SYNONYMS(=SYN)用户的同义词
§4.4.2 删除同义词
DROP PUBLIC synonym [schema.]synonym ;
Drop synonym emp;
例1:为当前所有对象建立同义词。为了省去编辑,可用下面个命令来完成:
* 需具有 dba, -- create any synonym,drop any synonym 权限
select 'drop public synonym '||object_name||' ;' from user_objects;
select ' create public synonym '||object_name||
' for sale.'||object_name||' ;' from user_objects;
§4.5 视图、同义词和序列有关的数据字典
当我们创建了视图、同义词和序列后,相关的信息就被记录到Oracle的数据字典中,作为程序人员和数据库管理员,应该了解有关数据字典的基本查询方法.
与视图、同义词和序列有关的数据字典有:
l DBA_VIEWS –实例中所有的视图的基本信息;
l DBA_SYNONYMS –实例中所有的同义词;
l DBA_SEQUENCES –实例中所有的序列。
发表评论
-
Oracle Cursor Sharing
2011-05-06 01:57 0上周被问到一个问题:oracle参数cursor_sharin ... -
sqlplus登录自动运行脚本
2011-04-20 00:02 2071如果每次使用sqlplus都要设置如serveroutput或 ... -
被问到的问题,导出DDL
2011-04-15 20:31 942导出DDL定义的几种方法 有时候经常需要导出建表语句,在这 ... -
about RESETLOGS
2010-09-15 22:12 931终于要面对RESETLOGS了,� ... -
BLOCK、EXTENT、SEGMENT、TABLESPACE、Data Dictionary
2010-08-14 16:44 1420BlockBlock 可以分为 Header Ta ... -
STATISTICS_LEVEL
2010-07-19 16:15 1139看图说话: Oracle Advisory B ... -
SGA_TARGET
2010-07-19 11:03 1436当SGA_TARGET设置为非零值,oracle 10g会自动 ... -
method of segment space management
2010-07-13 16:40 829Locally Managed Tablespaces有两种管 ... -
042 nologging 题目
2010-07-13 15:30 1263原题如下: if the tablespace is in t ... -
oracle sql解析顺序
2010-07-12 16:47 1480今天被问到了一个where rownum与order by的顺 ... -
利用oracle学习DB2
2010-07-01 11:14 923现在开始要接触多一个D ... -
关于RAC failover的实践
2010-05-21 09:19 1149关于之前RAC的failover同事们都有一个猜想,failo ... -
卸载clusterware
2010-05-20 09:32 1386最简单的就是运行以下两个脚本: ./rootdelete. ... -
dataguard成功实现物理switchover
2010-04-26 16:28 1387一直都不能实现switchover,在看了不少文档后终于实现, ... -
使用exp/imp转移大的数据库定义(脚本)
2010-04-23 15:05 989都知道exp rows=n可以不导出具体的数据,但是做全库导出 ... -
oracle 连接解释方法
2010-04-13 14:05 1048Easy Connect: 格式: <usern ... -
RMAN-06428
2010-03-25 15:11 1286今天建立新的nbu oracle client 遇到RMAN- ... -
oracle import改表名
2010-03-24 16:23 4994小技巧 现在工作有大量exp/imp工作,其中遇到过需要该表 ... -
dataguard 笔记
2010-03-23 09:50 1158推荐按照三思的文档去做,当然首先要了解dataguard的原理 ... -
fga的教训
2010-03-17 10:30 1297这是一个教训,记录下来 一个简单的需求,监测一个表记录不明被 ...
相关推荐
同义词是指表、视图、序列、过程、函数和包的别名。当应用程序或用户使用同义词操作模式对象时, Oracle 将自动查找与同义词对应的对象。同义词可以帮助用户更方便地访问数据库对象,并提高数据库的可维护性和可读性...
Oracle 实验报告 - 索引、视图、序列和同义词的创建 本实验报告旨在介绍 Oracle 中的索引、视图、序列和同义词的概念和应用。通过实验,掌握创建索引、视图、序列和同义词的命令,并理解它们在数据库中的作用。 一...
在Oracle数据库中,视图、同义词和序列都是重要的数据管理工具,它们各自有特定的功能和使用场景。 首先,让我们来深入理解视图。视图是基于一个或多个表的虚拟表,它是由SQL查询结果所形成的逻辑表。创建视图的...
本文将详细探讨四个关键概念:索引、视图、同义词和序列。 首先,索引是提升查询性能的关键工具。它们为表的特定列提供额外的数据结构,允许数据库更快地定位和检索数据。创建索引分为两种主要方式:企业管理器和...
在第13讲中,我们重点关注了四个核心概念:视图、索引、序列和同义词,这些都是数据库管理和优化的重要工具。 1. 视图(View) 视图是数据库中的一个虚拟表,它是由SQL SELECT语句定义的,基于一个或多个实际表(或...
在Oracle数据库管理中,实验3涉及到了几个关键的数据库对象:视图、序列、同义词和索引。这些元素是构建和管理高效数据库系统的重要组成部分。以下是它们的详细解释和示例: 1. **视图(View)**: 视图是从一个或...
本篇内容主要围绕Oracle中的三个关键概念:视图、序列和同义词展开,这些都是数据库管理和应用开发中的重要组成部分。 **视图**是Oracle数据库中一种虚拟表,它并不存储实际数据,而是根据用户定义的SQL查询逻辑从...
关于oracle对象管理的ppt资料,涵盖表,索引 视图 同义词和序列以及相关的练习
本实验主要涉及四个关键概念:视图、序列、同义词和索引。 **视图**是SQL中的一个重要特性,它允许用户创建一个虚拟的表,这个表的数据来源于一个或多个已存在的表,通过查询语句来定义。视图并不存储实际数据,...
在SQL中,视图、序列、同义词和索引是数据库管理中常见的概念,它们分别用于不同的目的,以提高数据管理和使用的效率。 视图(View)是虚拟表,它根据用户的需求,通过查询实际存在的表来构建。视图中的数据并非...
### Oracle索引、视图、序列与同义词实验知识点详解 #### 一、Oracle索引的创建与管理 **1.1 创建普通索引** - **实验目标**:掌握如何在Oracle数据库中为特定列创建索引。 - **实验步骤**:在SCOTT模式下,为`...
Oraclei视图序列索引和同义词PPT教案.pptx
在Oracle数据库的日常管理中,理解并熟练掌握序列和同义词的使用是非常必要的。序列可以确保数据的唯一性,而同义词则能提升代码的可读性和系统的可扩展性。通过学习和实践,数据库管理员和开发人员能够更好地利用...
此外,同义词机制也可以应用于视图、序列、程序单元等数据库对象的访问,提高数据库的可维护性和开发效率。 Oracle 同义词机制可以满足不同用户之间的数据库对象共享需求,提高开发效率和数据库的可维护性。但是,...
Java的JDBC提供了接口和类来与Oracle数据库交互,如`java.sql.Connection`、`java.sql.Statement`、`java.sql.PreparedStatement`等,通过这些接口,开发者可以在Java程序中创建、使用序列和同义词。 综上所述,...
通过以上详细介绍,我们可以看出索引、序列和同义词都是Oracle数据库中非常重要的对象,它们各自承担着不同的功能与职责,共同促进了数据库性能的提升和管理的便捷性。在实际应用中,合理地设计和使用这些对象能够...
小白必看!
在Oracle数据库系统中,同义词(Synonym)是一种非常实用的功能,它允许用户为数据库中的各种对象,如表、视图、序列、存储过程和包等,定义一个别名。这样做不仅简化了对象引用的复杂性,也增强了数据库的安全管理...
Oracle数据库的SQL开发教程涵盖了广泛的主题,其中包括序列、索引和同义词这些重要的数据库对象。在本章中,我们将深入探讨这些概念及其在数据库管理中的应用。 **序列(SEQUENCE)**是Oracle数据库中用于生成唯一...