Oracle数据库数据编程SQL<2.2 DDL 视图、序列>

目录

[一、Oracle 视图(Views)](#一、Oracle 视图(Views))

[(一) Oracle 视图特点](#(一) Oracle 视图特点)

[(二)Oracle 视图创建语法](#(二)Oracle 视图创建语法)

关键参数:

[(三)Oracle 视图类型](#(三)Oracle 视图类型)

1、普通视图

2、连接视图(可更新)

3、对象视图

[4、物化视图(Materialized Views)](#4、物化视图(Materialized Views))

[(四) Oracle 视图数据字典](#(四) Oracle 视图数据字典)

[(五)Oracle 可更新视图规则](#(五)Oracle 可更新视图规则)

(六)视图的优缺点

1、视图的优点:

2、视图的缺点:

3、视图和表的区别

[二、Oracle 序列(Sequences)](#二、Oracle 序列(Sequences))

[(一)Oracle 序列特点](#(一)Oracle 序列特点)

[(二)Oracle 序列创建语法](#(二)Oracle 序列创建语法)

重要参数:

[(三)Oracle 序列操作](#(三)Oracle 序列操作)

1、基本使用

2、修改序列

3、删除序列

[(四)Oracle 序列数据字典](#(四)Oracle 序列数据字典)

[(五)Oracle 序列高级特性](#(五)Oracle 序列高级特性)

1、缓存优化

2、循环序列

3、会话级序列(RAC环境)

[(六)Oracle 12c+ 序列增强](#(六)Oracle 12c+ 序列增强)

1、标识列(IDENTITY)

2、默认序列值

[三、Oracle 特有功能](#三、Oracle 特有功能)

[(一)物化视图(Materialized Views)](#(一)物化视图(Materialized Views))

1、创建刷新物化视图

2、物化视图日志

3、快速刷新

(二)序列与触发器结合

(三)视图与PL/SQL集成

[四、Oracle 最佳实践](#四、Oracle 最佳实践)

(一)视图最佳实践

(二)序列最佳实践

五、常见问题解决方案

(一)视图问题

问题1:视图变无效

问题2:视图性能差

(二)序列问题

问题1:序列缓存丢失

问题2:序列达到MAXVALUE

问题3:需要重置序列

[六、Oracle 20c/21c 新特性](#六、Oracle 20c/21c 新特性)

(一)视图增强

SQL宏视图:

JSON关系视图:

(二)序列增强


一、Oracle 视图(Views)

(一) Oracle 视图特点

Oracle 视图具有以下独特特性:

  • 1. 强大的安全控制:可通过视图实现行级和列级安全

  • 2. 优化器集成:Oracle 优化器能对视图查询进行高级优化

  • 3. 视图约束:支持在视图上定义约束

  • 4. 对象视图:可以基于对象类型创建视图

  • 5. 物化视图:Oracle 特有的高性能视图类型

  • ·视图名一般以v开头

    ·可以设置成只读模式 with read only

    ·修改视图相当于对原表进行修改

    !!!!!在工作中一般禁止用视图修改原表!!!!!!

    占的空间小,保密性高

(二)Oracle 视图创建语法

sql 复制代码
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、普通视图

sql 复制代码
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、连接视图(可更新)

sql 复制代码
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、对象视图

sql 复制代码
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)

sql 复制代码
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 视图数据字典

查看视图信息:

sql 复制代码
-- 用户视图定义
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操作:

  1. 视图不包含集合操作(UNION, INTERSECT等)

  2. 不包含GROUP BY, CONNECT BY, START WITH子句

  3. 不包含聚合函数

  4. 不包含DISTINCT

  5. 不包含ROWNUM伪列

  6. 涉及的所有表必须具有主键约束

(六)视图的优缺点

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 序列创建语法

sql 复制代码
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、基本使用

sql 复制代码
-- 获取下一个值
SELECT sequence_name.NEXTVAL FROM dual;

-- 获取当前值(不递增)
SELECT sequence_name.CURRVAL FROM dual;

-- 在DML中使用
INSERT INTO orders(order_id, ...) 
VALUES (order_seq.NEXTVAL, ...);

2、修改序列

sql 复制代码
ALTER SEQUENCE sequence_name
  [INCREMENT BY increment]
  [MAXVALUE maxvalue | NOMAXVALUE]
  [MINVALUE minvalue | NOMINVALUE]
  [CYCLE | NOCYCLE]
  [CACHE cache_size | NOCACHE]
  [ORDER | NOORDER];

注意:不能修改START WITH值,必须删除重建

3、删除序列

sql 复制代码
DROP SEQUENCE sequence_name;

(四)Oracle 序列数据字典

sql 复制代码
-- 用户序列信息
SELECT * FROM USER_SEQUENCES;

-- 序列权限
SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME = 'SEQUENCE_NAME';

(五)Oracle 序列高级特性

1、缓存优化

sql 复制代码
CREATE SEQUENCE high_perf_seq
CACHE 100;  -- 适合高并发系统

2、循环序列

sql 复制代码
CREATE SEQUENCE cyclic_seq
START WITH 1
INCREMENT BY 1
MAXVALUE 5
MINVALUE 1
CYCLE;

3、会话级序列(RAC环境)

sql 复制代码
CREATE SEQUENCE session_seq
SESSION;  -- 每个会话有独立序列值

(六)Oracle 12c+ 序列增强

1、标识列(IDENTITY)

Oracle 12c引入了类似自增列的语法:

sql 复制代码
CREATE TABLE orders (
    order_id NUMBER GENERATED ALWAYS AS IDENTITY,
    order_date DATE,
    ...
);

2、默认序列值

sql 复制代码
CREATE TABLE employees (
    emp_id NUMBER DEFAULT emp_seq.NEXTVAL,
    ...
);

三、Oracle 特有功能

(一)物化视图(Materialized Views)

1、创建刷新物化视图

sql 复制代码
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、物化视图日志

sql 复制代码
CREATE MATERIALIZED VIEW LOG ON sales 
WITH ROWID, SEQUENCE(amount, sale_date, product_id)
INCLUDING NEW VALUES;

3、快速刷新

sql 复制代码
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;

(二)序列与触发器结合

sql 复制代码
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集成

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 最佳实践

(一)视图最佳实践

  1. 命名规范 :使用V_前缀(如V_EMP_DEPT)

  2. 安全控制:通过视图限制敏感数据访问

  3. 性能监控:定期检查视图执行计划

  4. 注释文档:为视图添加注释说明

    sql 复制代码
    COMMENT ON VIEW v_emp_dept IS 'Employee with department information';
  5. 避免过度嵌套:限制视图嵌套层级(建议不超过3层

(二)序列最佳实践

  1. 缓存设置:生产环境建议CACHE >= 20

  2. 命名规范 :使用SEQ_前缀(如SEQ_ORDER_ID)

  3. 监控使用:定期检查序列接近MAXVALUE情况

    sql 复制代码
    SELECT sequence_name, last_number, max_value 
    FROM user_sequences 
    WHERE last_number/max_value > 0.9;
  4. RAC环境:使用ORDER序列确保全局顺序

  5. 避免循环:生产环境慎用CYCLE选项

五、常见问题解决方案

(一)视图问题

问题1:视图变无效

sql 复制代码
-- 重新编译无效视图
ALTER VIEW view_name COMPILE;

-- 查找所有无效视图
SELECT object_name FROM user_objects 
WHERE object_type = 'VIEW' AND status = 'INVALID';

问题2:视图性能差

sql 复制代码
-- 添加提示(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:序列缓存丢失

sql 复制代码
-- 增大缓存减少问题
ALTER SEQUENCE seq_name CACHE 100;

问题2:序列达到MAXVALUE

sql 复制代码
-- 修改序列(需要足够权限)
ALTER SEQUENCE seq_name MAXVALUE 999999999999;

-- 或创建新序列
CREATE SEQUENCE seq_name_new START WITH 1000000;

问题3:需要重置序列

sql 复制代码
-- 使用以下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宏视图

sql 复制代码
CREATE OR REPLACE VIEW v_emp_dept_macro
AS SELECT * FROM employees 
   WHERE department_id IN (SELECT department_id FROM departments);

JSON关系视图

sql 复制代码
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;

(二)序列增强

  1. SCALABLE序列(21c):

    sql 复制代码
    CREATE SEQUENCE seq_scalable SCALE EXTEND;
    -- 生成更短的唯一ID,适合分布式环境
  2. 会话级序列默认值

    sql 复制代码
    CREATE TABLE session_orders (
        id NUMBER DEFAULT ON NULL seq_session.NEXTVAL,
        ...
    );
相关推荐
Alan3163 小时前
Qt 中,设置事件过滤器(Event Filter)的方式
java·开发语言·数据库
TDengine (老段)3 小时前
TDengine 集群容错与灾备
大数据·运维·数据库·oracle·时序数据库·tdengine·涛思数据
Lao A(zhou liang)的菜园4 小时前
高效DBA的日常运维主题沙龙
运维·数据库·dba
迪迦不喝可乐5 小时前
mysql知识点
数据库·mysql
不太可爱的大白5 小时前
MySQL 事务的 ACID 四大特性及其实现原理
数据库·mysql
风景_fengjing6 小时前
ORACLE 缺失 OracleDBConsoleorcl服务导致https://xxx:port/em 不能访问
oracle
观测云6 小时前
HikariCP 可观测性最佳实践
数据库
文牧之6 小时前
PostgreSQL的扩展 dblink
运维·数据库·postgresql
趁你还年轻_7 小时前
Redis-旁路缓存策略详解
数据库·redis·缓存
在云上(oncloudai)7 小时前
AWS DocumentDB vs MongoDB:数据库的技术抉择
数据库·mongodb·aws