- 视图 是一种数据库对象,是从 一个或者多个 数据表或视图中导出的 虚表。
- 视图所对应的数据, 并不是真正的存储在 视图 中,而是 存储在所引用的数据表 中。
- 视图的结构和数据,是对数据表进行查询的结果。
- 根据创建视图时给定的条件,视图可以是一个数据表的一部分,也可以是多个基表的联合。
- 它存储了要执行检索的 查询语句的定义,以便在引用该视图时使用。
- 使用视图的优点:
- 简化数据操作:
视图可以简化用户处理数据的方式。- 着重于特定数据:
不必要的数据 或 敏感数据,可以不出现在视图中。- 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
- 提供向后兼容性:
视图使用户能够在表的架构更改时,为表创建向后兼容接口。- 集中分散数据。
- 简化查询语句。
- 重用SQL语句。
- 保护数据安全。
- 共享所需数据。
- 更改数据格式。
CREATE [OR REPLACE] [FORCE] VIEW '视图名'
AS '子查询'
[WITH [CASCADED|LOCAL] CHECK OPTION]
-- 只读。
[WITH READ ONLY]
| 参数 | 说明 |
|---|---|
| OR REPLACE | 若所创建的试图已经存在,Oracle 自动重建该视图 |
| FORCE | 不管基表是否存在,Oracle 都会自动创建该视图 |
| sub_query | 一条完整的 SELECT 语句,可以在该语句中定义别名 |
| WITH CHECK OPTION | 数据表 插入或修改 的数据行,必须满足视图定义的约束 |
| WITH READ ONLY | 该视图上不能进行任何 DML 操作 |
CREATE OR REPLACE VIEW `v_test`
AS
SELECT * FROM `customers`
WHERE `cus_sex` = 'M'
WITH CHECK OPTION;
-- 查看视图结构。
SHOW CREATE VIEW '视图名';
ALTER VIEW '视图名' [('列名1' ..., '列名n')]
AS
'select_statement'
[WITH [CASCADED|LOCAL] CHECK OPTION]
DROP VIEW [IF EXISTS] '视图名'[,'视图名2'] ... [RESTRICT|CASCADE];
-- RESTRICT:限制。
-- CASCADE:级联。
DROP VIEW 'view_name';
- 如果视图中的语句只是 单表查询,并且 没有聚合函数,我们就称之为 简单视图。
- 需求:创建视图,业主类型 为1 的业主信息。
create or replace view 'view_owners'
as
select * from 'T_OWNERS' where ownertypeid = 1;
- 查询该视图。
就像使用表一样,去使用视图就可以了。
select * from 'view_owners' where addressid = 1;
- 对于简单视图,不仅可以用查询,还可以 增删改 记录。
update 'view_owners' set name='王刚' where id = 2;
select * from 'view_owners';
-- 修改后,再次查询表数据,发现表的数据也跟着更改了。
- 结论:视图其实是一个虚拟的表,它的数据其实来自于表。
- 如果更改了视图的数据,表的数据也自然会变化。
- 更改了表的数据,视图也自然会变化。
- 一个视图所存储的并不是数据,而是一条 SQL 语句。
with check option 带检查约束视图
- 需求:根据 T_ADDRESS(地址表),创建视图 VIEW_ADDRESS。
内容为 区域ID 为2 的记录。
create or replace view 'view_address'
as
select * from 'T_ADDRESS' where areaid = 2
with check option;
- 执行更新语句。
报错。
-- 无法修改成功。
update 'view_address' set areaid = 1 where id = 4;
-- 因为该视图的条件是`arreaid = 2`,不能修改为`arreaid = 1`。
- 错误信息:
ORA-01402: view WITH CHECK OPTION where-clause violation
with read only 只读视图
- 如果创建一个视图,并不希望用户能对视图 进行修改。
- 就需要创建视图时,指定
WITH READ ONLY选项,这样创建的视图就是一个 只读视图。
- 需求:修改视图为 只读视图。
create or replace view 'view_owners'
as
select * from 'T_OWNERS' where ownertypeid = 1
with read only;
- 执行更新语句。
报错。
update 'view_owners' set name='王强' where id = 2;
- 错误信息:
ORA-42399: cannot perform a DML operation on a read-only view
- 创建一个视图,如果视图的 SQL语句 所设计的表并不存在。
-- 错误视图,创建不成功
create or replace view `view_TEMP`
as
-- `T_TEMP`表不存在
select * from 'T_TEMP';
- 因为 T_TEMP表 并不存在。
- 有的时候,创建视图时的表可能并不存在,但是以后可能会存在。
- 如果此时需要创建这样的视图,需要添加
FORCE选项。
create or replace FORCE view 'view_TEMP'
as
select * from 'T_TEMP';
- 复杂视图,就是视图的 SQL语句 中,有 聚合函数 或 多表关联查询。
- 需求:创建视图,查询显示 业主编号,业主名称,业主类型名称。
create or replace view 'view_owners'
as
select o.id '业主编号', o.name '业主名称', ot.name '业主类型'
from 'T_OWNERS' o, 'T_OWNERTYPE' ot
where o.ownertypeid = ot.id;
- 查询该视图。
select * from 'view_owners';
- 修改该视图。
-- 更新成功。
update view_owners set '业主名称' = '范小冰' where '业主编号' = 1;
-- 更新失败。
update view_owners set '业主类型' ='普通居民' where '业主编号' = 1;
- 出错误提示:是修改的列,不属于 键保留表 的列。
ORA-01779: cannot modify a column which maps to a non key-preserved table
- 键保留表。
- 键保留表,是理解 连接视图修改限制 的一个基本概念。
- 该表的主键列 全部显示在视图中,并且它们的值 在视图中都是 唯一且非空的。
- 简单说,表的键值 在一个 连接视图 中也是 键值,那么就称这个表为 键保留表。
- 上面视图中存在两个表,T_OWNERS(业主表)和 T_OWNERTYPE(业主类型表)。
- 其中 T_OWNERS表 就是 键保留表。因为 T_OWNERS表 的 主键,也是作为视图的主键。
- 键保留表 的 字段 是可以更新的,而 非键保留表 是不能更新的。
- 需求:创建视图,按年月统计水费金额。
create view 'view_account_sum'
as
-- 必须 + `money_sum` 别名
select year, month, sum(money) money_sum from 'T_ACCOUNT'
group by year, month
order by year, month;
- 修改该视图。
update 'view_account_sum'
set money_sum = money_sum - 100
where year = 2012 and month = 12;
- 此例用到聚合函数,没有键保留表,所以无法执行 update。
ORA-01732: data manipulation operation not legal on this view
- 视图是一个 虚拟表(也可以认为是一条语句)。
- 视图 是指定的 查询语句,返回的 结果集。每次访问视图,都会导致这个 查询语句 被执行一次。
- 为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个 物化视图(也叫实体化视图)。
- 物化视图 与 普通视图 相比的区别是。
- 物化视图 是建立的副本。
- 物化视图 类似于一张表,需要占用存储空间。
- 对一个 物化视图 查询的执行效率,与查询一个表是一样的。
# 物化视图日志(Tables)
MLOG$_'表名'
# 物化视图(Tables)
MV_'表名'
- 生成数据。
BUILD IMMEDIATE:
在创建物化视图的时候,就生成数据【默认】。BUILD DEFERRED:
在创建时不生成数据,以后根据需要再生成数据。
REFRESH刷新。
指当基表发生了 DML 操作后,物化视图 何时采用哪种方式 和 基表进行同步。- REFRESH 后跟着的刷新方法,有三种:
FAST、COMPLETE、FORCE。
FAST:
采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE:
对整个物化视图进行完全的刷新。FORCE:【默认】
刷新时去判断是否可以快速刷新。
如果可以则采用 FAST 方式,否则采用 COMPLETE 方式。
- 刷新的模式。
ON DEMAND:
指需要手动刷新物化视图【默认】。ON COMMIT:
指在基表发生 COMMIT操作时,自动刷新。
CREATE MATERIALIZED VIEW 'view_name'
-- 立即显示 | 延迟显示
[ 'BUILD IMMEDIATE' | BUILD DEFERRED ]
-- 快 | 完全 | 快or完全
REFRESH [ FAST | COMPLETE | 'FORCE' ]
[ON [ 'DEMAND' | COMMIT ] | START WITH (start_time) NEXT (next_time)]
AS 'sub_query';
手动刷新 的物化视图
- 需求:查询 地址ID、地址名称 和 所属区域名称。
create materialized view 'mv_address'
as
select ad.id, ad.name adname, ar.name ar_name
from 't_address' ad, 't_area' ar
where ad.areaid = ar.id;
- 执行查询语句。
select * from 'mv_address';
- 向基表 T_ADDRESS(地址表)中插入一条新记录。
insert into 't_address' values (8, '宏福苑小区', 1, 1);
- 执行视图查询,发现 新插入的数据 并没有出现在物化视图中。
-- 1、手写 PL/SQL 语句,手动刷新 物化视图。
begin
-- `C`完全刷新(COMPLETE)
DBMS_MVIEW.refresh('MV_ADDRESS', 'C');
end;
-- 2、通过下面的命令,手动刷新物化视图。
EXEC DBMS_MVIEW.refresh('MV_ADDRESS', 'C');
-- 注意:此命令需要在命令窗口中执行。
DBMS_MVIEW.refresh是 系统内置 的 存储过程。
执行命令后,再次查询物化视图,就可以查询到最新的数据了。
自动刷新 的物化视图
- 创建此物化视图后,当 T_ADDRESS 表发生变化时,MV_ADDRESS 自动跟着改变。
create materialized view 'mv_address_2'
refresh
-- 自动刷新
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from 't_address ad','t_area' ar
where ad.areaid=ar.id;
不生成数据 的物化视图create materialized view 'mv_address_3'
-- 创建不生成数据
build deferred
refresh
-- 自动刷新
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from 't_address' ad,'t_area' ar
where ad.areaid=ar.id;
- 创建后,执行下列语句查询物化视图,没有数据。
select * from `mv_address_3`;
- 需执行下列语句,生成数据。
begin
DBMS_MVIEW.refresh('MV_ADDRESS3', 'C');
end;
- 由于创建时指定的
on commit。- 所以在 修改数据 后,能立刻看到最新数据,无须再次执行
refresh。
增量刷新 的物化视图
- 如果创建 增量刷新 的物化视图,必须首先创建 物化视图日志。
- 物化视图日志,记录基表发生了哪些变化,用日志去 更新物化视图。
-- 根据`rowid`
create materialized view 'log' on 't_address' with rowid;
create materialized view 'log' on 't_area' with rowid;
- 创建的物化视图日志,名称为
MLOG$_表名称。
create materialized view 'mv_address_4'
-- 增量刷新
refresh fast
as
select ad.rowid adrowid, ar.rowid arrowid, ad.id, ad.name adname, ar.name ar_name
-- 需要创建两表日志
from 't_address' ad, 't_area' ar
where ad.areaid = ar.id;
- 注意:创建 增量刷新 的 物化视图。
- 创建物化视图中,涉及表的物化视图日志。
- 在查询语句中,必须包含所有表的
rowid(以 rowid 方式建立物化视图日志)
- 当向地址表插入数据后,物化视图日志的内容。
| 参数 | 说明 |
|---|---|
| SNAPTIME$$ | 用于表示刷新时间。 |
| DMLTYPE$$ | 用于表示 DML 操作类型(I 表示 INSERT,D 表示 DELETE,U 表示 UPDATE)。 |
| OLD_NEW$$ | 用于表示这个值是新值,还是旧值(N 表示 NEW新值,O 表示 OLD旧值,U 表示 UPDATE操作)。 |
| CHANGE_VECTOR$$ | 表示修改矢量,用来表示被修改的是哪个或哪几个字段(此列是 RAW类型)。其实 Oracle 采用的方式就是用每个 BIT位 去映射一个列。插入操作显示为: FE,删除显示为:OO,更新操作则根据更新字段的位置 而显示不同的值。 |
- 当手动刷新物化视图后,物化视图日志被清空,物化视图更新。
begin
DBMS_MVIEW.refresh('MV_ADDRESS4', 'C');
end;
plsql连接Oracle超时,完犊子了肯定是服务器断电了。得马上检查Oracle服务器状态1、检查数据库是否启动su-oracle切换到Oracle用户,输入sqlplus/assysdba显示连接状态。如果末尾显示的状态是Connectedtoanidleinstance.证明未启动2、启动数据库startup启动数据库,末尾出现Databaseopened说明数据库启动成功3、查看数据库监听是否正常先quit;断开Oracle连接,使用lsnrctlstatus查看监听状态,如果出现TNS-开头的Nolistener、Connectionrefused等错误,说明监听未启动4、启动数据库
我无法连接到OracleDB,阅读了很多资料但对结果没有帮助。我有远程OracleDB,我正在使用DBVisualizer设置连接连接到它,如下所示:DBType:OracleDriver(jdbc):OraclethinDatabaseURL:jdbc:oracle:thin:@10.10.100.10:1521/VVV.LOCALDOMAINUserIdf:SomeUserPass:SomePass连接正常。我在Ruby中所做的是:require'oci8'require'dbi'...conn=OCI8.new('SomeUser','SomePass','//10.10.100
我有以下代码执行oracleView,如下所示:defrun_queryconnection.exec_query("SELECT*FROMTABLE(FN_REQRESP(#{type_param},#{search_type_param},#{tid_param},#{last_param},#{key_param},#{tran_id_param},#{num_param},#{start_date_param},#{end_date_param}))")end上述查询的输出如下:SELECT*FROMTABLE(FN_REQRESP('ALL','ALL_TRAN','1000
C#连接oracle数据库常用的三种方法有三种: 一、Oracle.ManagedDataAccess.dll:Oracle官方提供的oracle数据库访问组件,不存在其他依赖dll库,推荐该方法最为重要的是:它不需要安装oracle客户端,也不区分x86位和x64位,直接就能用,连上其他电脑或者服务端oracle数据库。 二、Oracle.DataAccess.Client.dll:也叫ODP.net,是Oracle提供的数据库访问dll库。好处是:不需要安装客户端也能访问服务器上的oracle,不需要配置tnsNames.Ora文件,但是区分x86位和x64,也比较麻烦。 三、Sys
网络上有多个页面对此进行了讨论,但大多数都已过时或在某些方面不准确。独家新闻是什么? 最佳答案 构建ruby、gem和rails根据http://rubyonrails.org/download:buildrubybuildgemusegemtoinstallrails获取OracleInstantclient下载自https://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html您的架构需要这
我需要设计下面的视图。解释:前两个视图是卡片视图。顶部将包含下面的图表是4个瓷砖,该图像在其底部具有图像和文本问题:我能够获得这样的设计,但并不适合所有手机和屏幕类型。我怎样才能解决这个问题?代码:看答案尝试这个:您需要使用线性布局并将重量分配给两个卡布局50-50。
我是node.js的新手,我已经进行了研究但没有成功,所以这是我的问题:可以将Node.js与Oracle9i数据库一起使用吗?如果是这样,我在哪里可以找到相关资料?提前致谢! 最佳答案 上面提到的npmjs现在列出:https://www.npmjs.org/search?q=db-oracle->https://github.com/mariano/node-db-oraclehttps://www.npmjs.org/search?q=oracle->https://github.com/nearinfinity/node-o
这个问题在这里已经有了答案:workwithjsoninoracle(6个答案)关闭6个月前。Oracle11g是否支持JSON?我指的是在PL/SQL查询中操作JSON对象之类的东西。我知道Oralcle12c支持这些东西,但11g似乎不支持。我主要关心的是是否可以在PL/SQL代码中处理从RESTfullAPI调用(使用UTL_HTTP包)返回的JSON对象。这就是我调用RESTfullAPI的方式:req:=UTL_HTTP.BEGIN_REQUEST('https://xxxx/api/job/all','GET','HTTP/1.1');UTL_HTTP.set_header
我们在pushstate-only模式下使用Backbone.Router,因此我们所有的客户端路由都是无哈希的。但是,我们在应用中实现模态视图时遇到了困难。挑战如下:我们希望后退按钮隐藏当前模态视图(因此我们需要它有一个URL);我们希望Forward在不重绘整个应用程序的情况下再次显示它;我们希望能够在任何现有路线“之上”显示模式,而不仅仅是在一个页面上;我们希望能够创建立即显示特定模式(例如登录模态视图)的链接。换句话说,我们希望模态视图在历史中呈现。我们的第一次尝试是使用像/login这样的URL作为登录模式,并在route处理程序中专门处理它们。当我们在/otherpage上
在我的Ember.js应用程序中,我有一个包含各种帖子列表的索引View。我正在尝试实现点击帖子时发生的“显示”操作。它应该做的是显示一个模式更详细的帖子版本。帖子的每个模态视图也应该有自己的URL。此外,列出帖子的索引View仍应显示在帖子模态后面。最后,当帖子模式关闭时,URL应该变回索引URL到目前为止,我的路线是这样的:App.Router.reopenlocation:'history'rootURL:'/'App.Router.map->@resource'posts',->@route'show',path:'/:post_id'App.PostsShowRoute=Em