`
guoyanxi
  • 浏览: 272077 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

视图、同义词和序列

阅读更多
视图、同义词和序列
视图、同义词和序列是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 –实例中所有的序列。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics