Oracle 数据库高级操作说明

发布于:2025-02-17 ⋅ 阅读:(121) ⋅ 点赞:(0)

Oracle 数据库高级操作说明

1. 高级 SQL 操作
1.1 子查询

子查询是嵌套在另一个查询中的查询,常用于复杂的查询场景。

  • 单行子查询

    SELECT first_name, last_name
    FROM employees
    WHERE salary > (SELECT AVG(salary) FROM employees);
    
  • 多行子查询

    SELECT first_name, last_name
    FROM employees
    WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
    
1.2 连接查询
  • 内连接

    SELECT e.first_name, e.last_name, d.department_name
    FROM employees e
    INNER JOIN departments d ON e.department_id = d.department_id;
    
  • 外连接

    SELECT e.first_name, e.last_name, d.department_name
    FROM employees e
    LEFT JOIN departments d ON e.department_id = d.department_id;
    
1.3 集合操作
  • UNION

    SELECT first_name FROM employees
    UNION
    SELECT first_name FROM contractors;
    
  • INTERSECT

    SELECT first_name FROM employees
    INTERSECT
    SELECT first_name FROM contractors;
    
  • MINUS

    SELECT first_name FROM employees
    MINUS
    SELECT first_name FROM contractors;
    
2. PL/SQL 编程
2.1 PL/SQL 块

PL/SQL 是 Oracle 的过程化语言扩展,允许在数据库中编写存储过程、函数和触发器。

  • 匿名块
    DECLARE
        v_name VARCHAR2(50);
    BEGIN
        SELECT first_name INTO v_name FROM employees WHERE employee_id = 100;
        DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_name);
    END;
    
2.2 存储过程
  • 创建存储过程

    CREATE OR REPLACE PROCEDURE get_employee_name (p_employee_id IN NUMBER, p_name OUT VARCHAR2) AS
    BEGIN
        SELECT first_name INTO p_name FROM employees WHERE employee_id = p_employee_id;
    END;
    
  • 调用存储过程

    DECLARE
        v_name VARCHAR2(50);
    BEGIN
        get_employee_name(100, v_name);
        DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_name);
    END;
    
2.3 函数
  • 创建函数

    CREATE OR REPLACE FUNCTION get_employee_salary (p_employee_id IN NUMBER) RETURN NUMBER AS
        v_salary NUMBER;
    BEGIN
        SELECT salary INTO v_salary FROM employees WHERE employee_id = p_employee_id;
        RETURN v_salary;
    END;
    
  • 调用函数

    SELECT get_employee_salary(100) FROM dual;
    
2.4 触发器
  • 创建触发器
    CREATE OR REPLACE TRIGGER before_employee_insert
    BEFORE INSERT ON employees
    FOR EACH ROW
    BEGIN
        :NEW.hire_date := SYSDATE;
    END;
    
3. 高级备份与恢复
3.1 增量备份
  • 增量备份
    rman target /
    RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE;
    
3.2 点时间恢复
  • 点时间恢复
    rman target /
    RMAN> RUN {
        SET UNTIL TIME "TO_DATE('2023-10-01 12:00:00', 'YYYY-MM-DD HH24:MI:SS')";
        RESTORE DATABASE;
        RECOVER DATABASE;
    }
    
4. 数据仓库与分区
4.1 数据仓库
  • 创建数据仓库表
    CREATE TABLE sales_fact (
        sale_id NUMBER,
        sale_date DATE,
        product_id NUMBER,
        quantity NUMBER,
        amount NUMBER
    )
    PARTITION BY RANGE (sale_date) (
        PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01', 'YYYY-MM-DD')),
        PARTITION p2 VALUES LESS THAN (TO_DATE('2024-01-01', 'YYYY-MM-DD'))
    );
    
4.2 分区表维护
  • 添加分区

    ALTER TABLE sales_fact ADD PARTITION p3 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'));
    
  • 合并分区

    ALTER TABLE sales_fact MERGE PARTITIONS p1, p2 INTO PARTITION p1_p2;
    
5. 高级性能优化
5.1 索引优化
  • 创建位图索引

    CREATE BITMAP INDEX idx_employee_gender ON employees(gender);
    
  • 创建函数索引

    CREATE INDEX idx_employee_upper_name ON employees(UPPER(last_name));
    
5.2 并行查询
  • 启用并行查询
    ALTER SESSION ENABLE PARALLEL DML;
    SELECT /*+ PARALLEL(employees, 4) */ * FROM employees;
    
5.3 物化视图
  • 创建物化视图

    CREATE MATERIALIZED VIEW mv_employee_salary
    AS
    SELECT department_id, AVG(salary) avg_salary
    FROM employees
    GROUP BY department_id;
    
  • 刷新物化视图

    EXEC DBMS_MVIEW.REFRESH('mv_employee_salary');
    
6. 高级安全管理
6.1 数据加密
  • 透明数据加密 (TDE)
    ALTER TABLE employees MODIFY (salary ENCRYPT);
    
6.2 虚拟私有数据库 (VPD)
  • 创建 VPD 策略
    BEGIN
        DBMS_RLS.ADD_POLICY(
            object_schema => 'hr',
            object_name => 'employees',
            policy_name => 'emp_policy',
            function_schema => 'hr',
            policy_function => 'emp_policy_func',
            statement_types => 'SELECT, INSERT, UPDATE, DELETE'
        );
    END;
    
6.3 审计增强
  • 细粒度审计
    BEGIN
        DBMS_FGA.ADD_POLICY(
            object_schema => 'hr',
            object_name => 'employees',
            policy_name => 'audit_emp_salary',
            audit_condition => 'salary > 10000',
            audit_column => 'salary'
        );
    END;
    
7. 高级监控与诊断
7.1 AWR 报告
  • 生成 AWR 报告
    @?/rdbms/admin/awrrpt.sql
    
7.2 ADDM 报告
  • 生成 ADDM 报告
    @?/rdbms/admin/addmrpt.sql
    
7.3 SQL 调优顾问
  • 使用 SQL 调优顾问
    DECLARE
        task_name VARCHAR2(30);
    BEGIN
        task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => 'abc123');
        DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name);
    END;
    
8. 结论

通过掌握这些高级操作,您可以更有效地管理和优化 Oracle 数据库,满足复杂的企业级应用需求。无论是复杂的 SQL 查询、PL/SQL 编程、高级备份与恢复,还是性能优化和安全管理,Oracle 提供了丰富的工具和功能来支持您的数据库管理工作。