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

发布于:2025-03-29 ⋅ 阅读:(25) ⋅ 点赞:(0)

目录

一、Oracle 视图(Views)

(一) Oracle 视图特点

(二)Oracle 视图创建语法

关键参数:

(三)Oracle 视图类型

1、普通视图

2、连接视图(可更新)

3、对象视图

4、物化视图(Materialized Views)

(四) Oracle 视图数据字典

(五)Oracle 可更新视图规则

(六)视图的优缺点

1、视图的优点:

2、视图的缺点:

3、视图和表的区别

二、Oracle 序列(Sequences)

(一)Oracle 序列特点

(二)Oracle 序列创建语法

重要参数:

(三)Oracle 序列操作

1、基本使用

2、修改序列

3、删除序列

(四)Oracle 序列数据字典

(五)Oracle 序列高级特性

1、缓存优化

2、循环序列

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

(六)Oracle 12c+ 序列增强

1、标识列(IDENTITY)

2、默认序列值

三、Oracle 特有功能

(一)物化视图(Materialized Views)

1、创建刷新物化视图

2、物化视图日志

3、快速刷新

(二)序列与触发器结合

(三)视图与PL/SQL集成

四、Oracle 最佳实践

(一)视图最佳实践

(二)序列最佳实践

五、常见问题解决方案

(一)视图问题

问题1:视图变无效

问题2:视图性能差

(二)序列问题

问题1:序列缓存丢失

问题2:序列达到MAXVALUE

问题3:需要重置序列

六、Oracle 20c/21c 新特性

(一)视图增强

SQL宏视图:

JSON关系视图:

(二)序列增强


一、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操作:

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

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

(一)视图最佳实践

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

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

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

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

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

(二)序列最佳实践

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

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

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

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

  5. 避免循环:生产环境慎用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 新特性

(一)视图增强

  1. SQL宏视图

    CREATE OR REPLACE VIEW v_emp_dept_macro
    AS SELECT * FROM employees 
       WHERE department_id IN (SELECT department_id FROM departments);
  2. 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;

(二)序列增强

  1. SCALABLE序列(21c):

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

    CREATE TABLE session_orders (
        id NUMBER DEFAULT ON NULL seq_session.NEXTVAL,
        ...
    );