【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://developer.aliyun.com/article/1634558
出自【进步*于辰的博客】
1、知识点扩展
- 细节与使用经验。
- 约束。
- 索引。
- 内置函数。
- 伪列。
5、数据类型
5.1 char族
Oracle中char族数据类型与MySQL中相同,大家可查阅博文《[MySQL]知识点》的第3项,在此不作赘述。5.2 number(a, b)
参考笔记一,P20.13。
此数据类型为数字,可存储小数。其中,a 是数字位数(包括小数),b 是精确小数位数。
规则:
- 若
b > 0
,表示精确b
位小数,并四舍五入; - 若
b < 0
,表示精确到小数点左b
位,并四舍五入,故只能存储整数。如:number(5, 3)
,可存储五位数整数,个位和十位都为0
; - 若
b = 0
,则只能存储整数; - 若
a < b
,则只能存储-1 ~ 0
或0 ~ 1
的小数,且小数点右b - a
位及其后都必须是0
(前后四舍五入都要满足),即精确b
位小数。7、视图(
view
)推荐一篇博文《Oracle视图详解》(转发)。
参考笔记一,P22.24、P23.15~17。7.1 介绍
view
可认为是一种绑定了SQL语句的原表“副本”,故当查询视图时,都会重新执行一次SQL语句查询原表,且修改视图记录等同于修改原表记录。
不过,若视图记录是由原表记录经处理后生成,即SQL语句中包含“数据处理”子句或条件时,不允许变动视图记录。“数据处理”子句或条件有:
group
函数;- group by;
- distinct;
- 使用表达式定义的字段;
- 伪列
rownum
; - 原表在视图中未选择(未
select
)的字段的所有数据为非空且无默认值。
当然,并非只要SQL语句中包含了这6个子句或条件,就无法对视图进行全部DML。规则如下:
- 删除视图记录。要求SQL语句中不能包含前3个子句或条件。
- 修改视图记录。要求SQL语句中不能包含前5个子句或条件。
- 新增视图记录。要求SQL语句中不能包含所有子句或条件。
我们也可以干脆在SQL语句末添加with read only
子句禁用视图DML。
7.2 数据字典
--当前用户旗下所有视图--
user_views
--显示视图中哪些字段允许DML--
user_updatable_columns
7.3 一个问题
假若SQL语句是:
create view v_emp_1(id, name, sal)
as
select emp_id, emp_name, sal
from emps
where dept_no = 10;
这里dept_no
是外键,该视图记录为员工表中隶属部门10
的所有员工信息。
现在,我把10
改成20
。前言道,查询视图是对原表的再次查询,这样修改后,该视图记录就变为部门20
的所有员工信息。可是,view
是原表的“副本”,既然创建视图时部门编号为10
,说明当时我设定该视图的作用是用于快速查询部门10
的所有员工信息,那么又怎能允许后续随意修改查询条件(dept_no = 10
)。
因此,可以在SQL语句末添加with check option constraint 约束名
子句,设置一个约束限制这种修改。
7.4 示例
创建:
create or replace view v as
select '123' as data from dual union all
select 'abc' from dual union all
select '123abc' from dual union all
select 'abc123' from dual union all
select '1a2b3c' from dual union all
select '1a2b3c#' from dual union all
select '3$' from dual union all
select '#a4' from dual union all
select 'a 2 ' from dual ;
数据:
最后
本文中的例子是为了方便大家理解和阐述知识点而简单举出的,旨在阐明知识点,并不一定有实用性,仅是抛砖引玉。
本文持续更新中。。。