目录
一、Oracle 视图(Views)
(一) Oracle 视图特点
Oracle 视图具有以下独特特性:
1. 强大的安全控制:可通过视图实现行级和列级安全
2. 优化器集成:Oracle 优化器能对视图查询进行高级优化
3. 视图约束:支持在视图上定义约束
4. 对象视图:可以基于对象类型创建视图
5. 物化视图:Oracle 特有的高性能视图类型
·视图名一般以v开头
·可以设置成只读模式 with read only
·修改视图相当于对原表进行修改
!!!!!在工作中一般禁止用视图修改原表!!!!!!
占的空间小,保密性高
(二)Oracle 视图创建语法
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW [schema.]view_name
[(column1, column2, ...)]
AS subquery
[WITH {CHECK OPTION [CONSTRAINT constraint_name]
| READ ONLY
| CONSTRAINT constraint_name}];
create{or replace(有的话覆盖先前)} view 视图名
as select语句{with read only---设置成只读}
关键参数:
FORCE
:即使基表不存在也创建视图NOFORCE
:默认,基表必须存在WITH CHECK OPTION
:确保通过视图的DML操作满足视图条件READ ONLY
:禁止通过视图进行DML操作
(三)Oracle 视图类型
1、普通视图
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.last_name, e.salary, d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
2、连接视图(可更新)
CREATE VIEW emp_dept_updatable AS
SELECT e.employee_id, e.last_name, e.salary, e.department_id, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE d.location_id = 1700
WITH CHECK OPTION CONSTRAINT emp_dept_check;
3、对象视图
CREATE TYPE emp_obj AS OBJECT (
emp_id NUMBER,
emp_name VARCHAR2(100),
salary NUMBER
);
CREATE VIEW emp_obj_view OF emp_obj
AS SELECT employee_id, last_name, salary FROM employees;
4、物化视图(Materialized Views)
CREATE MATERIALIZED VIEW mv_emp_summary
REFRESH COMPLETE ON DEMAND
AS SELECT department_id, COUNT(*) emp_count, AVG(salary) avg_sal
FROM employees
GROUP BY department_id;
(四) Oracle 视图数据字典
查看视图信息:
-- 用户视图定义
SELECT * FROM USER_VIEWS WHERE VIEW_NAME = 'EMP_DEPT_VIEW';
-- 视图依赖关系
SELECT * FROM USER_DEPENDENCIES WHERE NAME = 'EMP_DEPT_VIEW';
-- 视图列信息
SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'EMP_DEPT_VIEW';
(五)Oracle 可更新视图规则
Oracle 允许在以下条件下通过视图进行DML操作:
视图不包含集合操作(UNION, INTERSECT等)
不包含GROUP BY, CONNECT BY, START WITH子句
不包含聚合函数
不包含DISTINCT
不包含ROWNUM伪列
涉及的所有表必须具有主键约束
(六)视图的优缺点
1、视图的优点:
(1)使用视图,可以定制用户数据,聚焦特定数据
(2)使用视图,可以简化数据
(3)使用时图,对基表中的数据有一定的安全性
(4)使用视图,可以合并分离的数据,创建分区视图
2、视图的缺点:
(1)性能差
(2)修改限制
3、视图和表的区别
(1)视图是已经编译好的sql语句,而表不是
(2)视图没有实际的物理记录,而表有
(3)表是内容,视图是窗口
(4)表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在
表可以及时对他修改,但视图只能由创建语句来修改
(5)表是内模式,视图是外模式
(6)视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,
只是一些sql语句的集合,从安全角度说,试图可以不给用户接触数据表,从而不知道表结构
(7)表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表
(8)视图的建立和删除只影响视图本身,不影响对应的基表
二、Oracle 序列(Sequences)
(一)Oracle 序列特点
Oracle 序列提供以下特性:
1、高性能:序列值缓存于内存,减少磁盘I/O
2、事务安全:序列值生成不受事务回滚影响
3、可配置性:灵活控制序列行为
4、不连续保证:可能产生间隙,不适合严格连续场景
(二)Oracle 序列创建语法
CREATE SEQUENCE [schema.]sequence_name
[INCREMENT BY increment]
[START WITH start]
[MAXVALUE maxvalue | NOMAXVALUE]
[MINVALUE minvalue | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE cache_size | NOCACHE]
[ORDER | NOORDER]
[SESSION | GLOBAL];
数据库中一个特殊存放等差数列的表。
主要用于提供主键值。
create sequence 序列名
start with 数1 --从几开始
maxvalue 数2 --最大值,到几结束
{minvalue 数3/nominvalue} --最小值,不写每个最小值默认1
increment by 数4 --一次增加几。等差,步长
cache/nocache 数5 --缓存值,提前运行多少次放在内存里。不写默认20
--缓存值(类似于看视频提前缓存)
--默认20, 必须小于循环次数即:cache<maxvalue
cycle/nocycle --是否循环。默认不循环
select 序列名.nextval from dual;---下一个值
select 序列名.currval from dual;---当前值
重要参数:
CACHE
:默认20,建议高并发系统增大缓存ORDER
:确保序列值按请求顺序生成(仅RAC环境需要)SESSION
/GLOBAL
:序列作用域(仅RAC环境)
(三)Oracle 序列操作
1、基本使用
-- 获取下一个值
SELECT sequence_name.NEXTVAL FROM dual;
-- 获取当前值(不递增)
SELECT sequence_name.CURRVAL FROM dual;
-- 在DML中使用
INSERT INTO orders(order_id, ...)
VALUES (order_seq.NEXTVAL, ...);
2、修改序列
ALTER SEQUENCE sequence_name
[INCREMENT BY increment]
[MAXVALUE maxvalue | NOMAXVALUE]
[MINVALUE minvalue | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE cache_size | NOCACHE]
[ORDER | NOORDER];
注意:不能修改START WITH值,必须删除重建
3、删除序列
DROP SEQUENCE sequence_name;
(四)Oracle 序列数据字典
-- 用户序列信息
SELECT * FROM USER_SEQUENCES;
-- 序列权限
SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME = 'SEQUENCE_NAME';
(五)Oracle 序列高级特性
1、缓存优化
CREATE SEQUENCE high_perf_seq
CACHE 100; -- 适合高并发系统
2、循环序列
CREATE SEQUENCE cyclic_seq
START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE 1
CYCLE;
3、会话级序列(RAC环境)
CREATE SEQUENCE session_seq
SESSION; -- 每个会话有独立序列值
(六)Oracle 12c+ 序列增强
1、标识列(IDENTITY)
Oracle 12c引入了类似自增列的语法:
CREATE TABLE orders (
order_id NUMBER GENERATED ALWAYS AS IDENTITY,
order_date DATE,
...
);
2、默认序列值
CREATE TABLE employees (
emp_id NUMBER DEFAULT emp_seq.NEXTVAL,
...
);
三、Oracle 特有功能
(一)物化视图(Materialized Views)
1、创建刷新物化视图
CREATE MATERIALIZED VIEW mv_sales_monthly
REFRESH COMPLETE ON DEMAND
ENABLE QUERY REWRITE
AS SELECT TRUNC(sale_date, 'MONTH') AS month,
product_id,
SUM(amount) AS total_amount
FROM sales
GROUP BY TRUNC(sale_date, 'MONTH'), product_id;
2、物化视图日志
CREATE MATERIALIZED VIEW LOG ON sales
WITH ROWID, SEQUENCE(amount, sale_date, product_id)
INCLUDING NEW VALUES;
3、快速刷新
CREATE MATERIALIZED VIEW mv_sales_daily
REFRESH FAST ON COMMIT
AS SELECT TRUNC(sale_date) AS day,
product_id,
SUM(amount) AS total_amount
FROM sales
GROUP BY TRUNC(sale_date), product_id;
(二)序列与触发器结合
CREATE OR REPLACE TRIGGER trg_emp_id
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
IF :NEW.employee_id IS NULL THEN
:NEW.employee_id := emp_seq.NEXTVAL;
END IF;
END;
/
(三)视图与PL/SQL集成
CREATE OR REPLACE VIEW emp_dept_plsql AS
SELECT e.*, d.department_name,
CASE WHEN e.salary > 10000 THEN 'High'
WHEN e.salary > 5000 THEN 'Medium'
ELSE 'Low' END AS salary_grade
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
四、Oracle 最佳实践
(一)视图最佳实践
命名规范:使用
V_
前缀(如V_EMP_DEPT
)安全控制:通过视图限制敏感数据访问
性能监控:定期检查视图执行计划
注释文档:为视图添加注释说明
COMMENT ON VIEW v_emp_dept IS 'Employee with department information';
避免过度嵌套:限制视图嵌套层级(建议不超过3层
(二)序列最佳实践
缓存设置:生产环境建议CACHE >= 20
命名规范:使用
SEQ_
前缀(如SEQ_ORDER_ID
)监控使用:定期检查序列接近MAXVALUE情况
SELECT sequence_name, last_number, max_value FROM user_sequences WHERE last_number/max_value > 0.9;
RAC环境:使用ORDER序列确保全局顺序
避免循环:生产环境慎用CYCLE选项
五、常见问题解决方案
(一)视图问题
问题1:视图变无效
-- 重新编译无效视图
ALTER VIEW view_name COMPILE;
-- 查找所有无效视图
SELECT object_name FROM user_objects
WHERE object_type = 'VIEW' AND status = 'INVALID';
问题2:视图性能差
-- 添加提示(Hint)
CREATE OR REPLACE VIEW v_fast_emp AS
SELECT /*+ INDEX(e emp_dept_idx) */ e.*, d.department_name
FROM employees e JOIN departments d ON e.department_id = d.department_id;
(二)序列问题
问题1:序列缓存丢失
-- 增大缓存减少问题
ALTER SEQUENCE seq_name CACHE 100;
问题2:序列达到MAXVALUE
-- 修改序列(需要足够权限)
ALTER SEQUENCE seq_name MAXVALUE 999999999999;
-- 或创建新序列
CREATE SEQUENCE seq_name_new START WITH 1000000;
问题3:需要重置序列
-- 使用以下PL/SQL过程重置序列
DECLARE
v_nextval NUMBER;
BEGIN
EXECUTE IMMEDIATE 'ALTER SEQUENCE seq_name INCREMENT BY -999999';
SELECT seq_name.NEXTVAL INTO v_nextval FROM dual;
EXECUTE IMMEDIATE 'ALTER SEQUENCE seq_name INCREMENT BY 1';
END;
/
六、Oracle 20c/21c 新特性
(一)视图增强
SQL宏视图:
CREATE OR REPLACE VIEW v_emp_dept_macro AS SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments);
JSON关系视图:
CREATE OR REPLACE VIEW v_json_emp
AS SELECT e.employee_id, JSON_OBJECT('name' VALUE e.last_name,
'salary' VALUE e.salary) AS emp_data
FROM employees e;
(二)序列增强
SCALABLE序列(21c):
CREATE SEQUENCE seq_scalable SCALE EXTEND; -- 生成更短的唯一ID,适合分布式环境
会话级序列默认值:
CREATE TABLE session_orders ( id NUMBER DEFAULT ON NULL seq_session.NEXTVAL, ... );