oracle 视图

1,视图概念:
      视图是一个逻辑结构,本身不包含任何数据,是一个可命名的select语句
      透过视图可以看到底层数据,但是视图和数据是相互独立的。
2,创建视图需要有DBA权限。
3,语法:CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(alias[,alias]..)]
      AS subquery;
4,create or replace 表示若视图存在则替换掉;
如:
SQL> create view testview3
  2  as
  3  select * from test3;
视图已创建。
 
SQL> create view testview3
  2  as
  3  select * from test3;
create view testview3
            *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用
修改视图:
SQL> create or replace view testview3
  2  as
  3  select * from test3;
视图已创建。
5,force 表示若表不存在则强制创建视图;
如:SQL> create view tt
  2  as
  3  select * from tt;
create view tt
            *
第 1 行出现错误:
ORA-01731: 出现循环的视图定义

SQL> create force view tt
  2  as
  3  select * from tt;
警告: 创建的视图带有编译错误。
6,查看视图结构:
SQL> desc testview3;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(38)
 LNAME                                              VARCHAR2(20)
 FNAME                                              VARCHAR2(20)
7,在使用聚合函数创建视图时,需制定别名;
SQL> create view testview4
  2  as
  3  select id,sum(id) from test3
  4  group by id;
select id,sum(id) from test3
          *
第 3 行出现错误:
ORA-00998: 必须使用列别名命名此表达式

SQL> create view testview4
  2  as
  3  select id,sum(id) test3_id from test3
  4  group by id;
视图已创建。
===========================
***************************
8,更新视图:
SQL> select * from testview5;
  TEST5_ID TEST5_NAME           TEST5_FNAME
---------- -------------------- --------------------
         3 kong                 sales
         2 hh
SQL> update testview5 set test5_name='kong_gai'
  2  where test5_id=3;
已更新 1 行。
SQL> select * from testview5;
  TEST5_ID TEST5_NAME           TEST5_FNAME
---------- -------------------- --------------------
         3 kong_gai             sales
         2 hh
=========================================================
CREATE TABLE count1
(num1 NUMBER(4,2),
num2 NUMBER(5,2),
result NUMBER(6,2));
select * from count1
insert into count1 values(1,2,3)
insert into count1 values(3,4,5)
--------------------------
create or replace view testview3
as
select * from count1
-------------------
select * from testview3
update testview3 set num1 = 9 where num2=2 ----通过更新视图,更新了视图检索的数据,同时更新了基本表中的数据:
1. select * from testview3
2. select * from count1         
---------------------------------
 
对另一个数据对象而言同义词是一个别名。public同义词是针对所有用户的,相对而言private同义词则只针对对象拥有者或被授予权限的账户。
在本地数据库中同义词可以表示表、视图、序列、程序、函数或包等数据对象,也可以通过链接表示另一个数据库的对象。
------------------------------
1.创建同义词语句:

  create public synonym table_name for user.table_name;

  其中第一个table_name和第二个table_name可以不一样。

  此外如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访问,然后在使用如下语句创建数据库同义词:create synonym table_name for table_name@DB_Link;

  当然,你可能需要在user用户中给当前用户(user2)授权: grant select/delete/update on user2

2.删除同义词:

  drop public synonym table_name;

  3.查看所有同义词:

  select * from dba_synonyms

  同义词拥有如下好处:
节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;
扩展数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;
同义词可以创建在不同的数据库服务器上,通过网络实现连接。
 
 -------------------------------------------------
问题描述:
有两个oralce实例 SID分别为 A B
A中a用户下含有表objects
B中有b用户
使在B中用b用户登录后执行
select * from objects
能显示出A中a.objects的全部内容

问题解答:
用b用户登录到B中,执行:
create public synonym objects for a.objects@A
此时执行select * from objects 就能显示出a.objects的全部内容

需要注意的一点:
B中不能含有table b.objects否则语句可以执行,但是执行select操作时显示的仍然为b.objects的内容,需要先把.objects删除掉,重新建立synonym即可。

删除同义词

使用DROP SYNONYM语句删除不再需要的同义词 要想删除私有同义词 就省略 PUBLIC 关键字;

要想删除公共同义词 就要包括PUBLIC 关键字


DROP SYNONYM emp;  删除名为emp 的私有同义词

DROP PUBLIC SYNONYM public_emp;  删除名为public_emp的公有同义词
--------------------------------------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值