知识库✳

教程与手册

全部教程
  1. 01Oracle 函数手册
  2. 02性能优化手册
  3. 03Linux Shell
  4. 04Oracle 学习与演练
  5. 05网络基础学习
  6. 06数据治理与管理
返回个人网站
甲Oracle 学习教程从 SQL 到 PL/SQL 与运维
首页课程目录搜索演练场
知识库

已完成 0 / 22 章

模块一 · 入门与准备

  • 01Oracle 数据库体系结构
  • 02环境安装与连接方式
  • 03SQL*Plus 与常用工具

模块二 · SQL 查询基础

  • 04SELECT 查询基础
  • 05过滤与排序
  • 06单行函数
  • 07多表连接
  • 08分组聚合与 HAVING
  • 09子查询

模块三 · 数据与对象

  • 10DML 与事务控制
  • 11表与数据类型
  • 12约束
  • 13索引与执行计划
  • 14视图、序列与同义词

模块四 · PL/SQL 编程

  • 15PL/SQL 块与变量
  • 16流程控制与游标
  • 17存储过程与函数
  • 18触发器
  • 19异常处理

模块五 · 运维与进阶

  • 20用户与权限管理
  • 21表空间与存储管理
  • 22备份与恢复
❖

Oracle 学习教程

返回个人网站知识库

示例代码基于 Oracle AI Database 26ai / 23ai,查询示例使用官方 HR 示例方案。

以 Next.js 16 · Tailwind CSS v4 · HeroUI v3 装帧

14
  1. 首页
  2. 课程目录
  3. 视图、序列与同义词

第 14 章◆进阶◆建议 40 分钟◆模块三 · 数据与对象

视图、序列与同义词

用视图封装复杂查询、用序列生成主键、用同义词简化对象引用。

学完这一章,你应该能

  • 会创建视图并理解只读视图的意义
  • 掌握序列与 IDENTITY 列生成主键
  • 会用同义词对外屏蔽真实对象名

14.1视图

  • 视图不存数据(普通视图),只存查询定义,每次访问都重新执行
  • 视图能简化复杂查询,也能用来做权限隔离(只暴露部分列)
  • WITH READ ONLY 明确禁止通过视图修改数据
  • 物化视图(MATERIALIZED VIEW)会实际存数据,适合昂贵的统计查询
视图的三种常见形态
-- 1) 简单视图:可增删改(若底层可推导)
CREATE OR REPLACE VIEW v_emp_basic AS
SELECT employee_id, last_name, salary, department_id
FROM   employees
WHERE  department_id IS NOT NULL;

-- 2) 复杂视图:含聚合,只读
CREATE OR REPLACE VIEW v_dept_stats AS
SELECT d.department_id,
       d.department_name,
       COUNT(e.employee_id)     AS headcount,
       ROUND(AVG(e.salary), 2)  AS avg_salary
FROM   departments d
LEFT   JOIN employees e ON e.department_id = d.department_id
GROUP  BY d.department_id, d.department_name;

-- 3) 带检查选项:通过视图插入的数据必须满足视图条件
CREATE OR REPLACE VIEW v_emp_dept60 AS
SELECT * FROM employees WHERE department_id = 60
WITH CHECK OPTION;

只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。

14.2序列与自增主键

序列用法
CREATE SEQUENCE seq_emp_id
  START WITH 1000
  INCREMENT BY 1
  NOCACHE       -- 开发环境便于观察;生产建议 CACHE 提高性能
  NOCYCLE;

-- 取下一个值(每调用一次自增)
SELECT seq_emp_id.NEXTVAL FROM dual;

-- 取当前值(同一会话必须先调用过 NEXTVAL)
SELECT seq_emp_id.CURRVAL FROM dual;

INSERT INTO employees_demo (employee_id, last_name)
VALUES (seq_emp_id.NEXTVAL, 'Zhang');

只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。

12c+ 的 IDENTITY 列(更简洁)
CREATE TABLE t_order (
  order_id   NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  order_no   VARCHAR2(30),
  created_at DATE DEFAULT SYSDATE
);

INSERT INTO t_order (order_no) VALUES ('SO-2024-001');
-- 无需指定主键
SELECT * FROM t_order;

只作示例阅读:5 行写入限制下只开放单独创建普通空表;CTAS、删表、清空表、改结构、触发器和存储程序不允许执行。请在独立学习数据库中练习。

提示 序列的 NEXTVAL 不受事务回滚影响:回滚了,号也跳过去了。所以主键会「断号」,这是正常的,不要为此去改设计。

14.3同义词

  • 同义词常用于屏蔽 schema 名,便于应用迁移时改指向
  • 同义词只是别名,不占额外存储,但会增加一层解析开销
  • 注意:同义词不改变权限,用户仍需对底层对象有权限
私有同义词与公共同有同义词
-- 私有同义词:只有当前用户能用
CREATE SYNONYM emp FOR hr.employees;

-- 公共同义词:所有用户都能用(需要权限)
CREATE PUBLIC SYNONYM employees FOR hr.employees;

-- 删除
DROP SYNONYM emp;

私有同义词 CREATE SYNONYM 普通用户就能做;但这行 CREATE PUBLIC SYNONYM 需要 DBA 权限,否则报 ORA-01031: insufficient privileges。

只作示例阅读:公共同义词。请在独立学习数据库中练习。

练习

3 题 · 先自己写,再展开对照

参考答案

普通视图不存数据,只保存查询定义,每次访问都重新执行底层查询。
它用于简化复杂查询和做权限隔离。

当底层查询很昂贵(大表多表聚合)、又被频繁访问时,才用物化视图
(MATERIALIZED VIEW)——它会把结果实际落盘,按需刷新。
代价是数据存在延迟,且需要维护刷新策略。

自评要点

  • 普通视图不存数据
  • 物化视图存数据,适合昂贵且频繁的统计查询

参考答案

不会。序列的 NEXTVAL 不受事务回滚影响,取过的号就跳过去了,
所以主键会出现断号。

这是正常且预期的行为——序列为了保证并发性能本来就不参与事务回滚。
不要为了追求连续编号去改设计;如果业务真的要求连续无缺口,
那是另一个问题,并且通常需要串行化,代价很高。

自评要点

  • 序列不参与回滚,会断号
  • 认识到这是特性而非 bug

参考答案

它限制通过该视图进行的 INSERT / UPDATE 必须满足视图定义中的
WHERE 条件,否则报错。

例如:
CREATE OR REPLACE VIEW v_emp_dept60 AS
SELECT * FROM employees WHERE department_id = 60
WITH CHECK OPTION;

此时通过视图插入 department_id = 70 的行会被拒绝,
否则插入的行看不在视图里,会造成逻辑混乱。

想彻底禁止改数据就用 WITH READ ONLY。

自评要点

  • 约束通过视图做的 DML 必须满足视图条件
  • 与 WITH READ ONLY 的区别
← 上一章

索引与执行计划

下一章 →

PL/SQL 块与变量