Oracle 11g 的数据库对象是构建和运行数据库系统的核心单元,不同对象各司其职,相互配合实现数据的高效存储、管理与应用。以下从核心对象的定义、作用、特性以及操作示例等方面展开详细说明:


1. 表

表是 Oracle 数据库中最基础的对象,用于永久存储结构化数据,所有其他数据库对象(如视图、索引)大多依赖表而存在。

关键特性​

1.结构化存储:由 “列(Column)” 和 “行(Row)” 组成,列定义数据的类型(如VARCHAR2(50)(字符串)、NUMBER(10)(数字)、DATE(日期))、长度及约束;行对应一条具体的数据记录。​

2.约束保障完整性:通过约束(Constraint)确保数据准确性,常见约束包括:​

3.主键(Primary Key):唯一标识表中每条记录,非空且唯一,如用户表的 “用户 ID”。​

4.外键(Foreign Key):关联两个表,保证关联数据的一致性,如订单表的 “用户 ID” 关联用户表的 “用户 ID”。​

5.非空(NOT NULL):限制列必须填写数据,如 “用户名” 列不可为空。​

6.唯一(UNIQUE):限制列的值唯一,如 “手机号” 列不可重复。

创建表

-- 创建“用户表(USER_INFO)”
CREATE TABLE USER_INFO (
    USER_ID NUMBER(10) PRIMARY KEY,  -- 主键(用户ID)
    USER_NAME VARCHAR2(50) NOT NULL, -- 用户名(非空)
    PHONE VARCHAR2(20) UNIQUE,      -- 手机号(唯一)
    CREATE_TIME DATE DEFAULT SYSDATE -- 创建时间(默认取当前时间)
);

修改表结构

ALTER TABLE USER_INFO ADD EMAIL VARCHAR2(100);

2. 视图

视图是基于一个或多个表(或其他视图)的虚拟表,本身不存储实际数据,仅保存 SQL 查询语句,相当于数据访问的 “过滤镜” 和 “简化器”

关键特性

1.简化复杂查询:将多表关联、子查询等复杂逻辑封装成视图,用户无需记忆复杂 SQL,直接查询视图即可。

2.控制数据权限:通过视图隐藏表中的敏感字段(如用户表的 “密码” 列),仅开放必要信息给特定用户。

3.数据独立性:若底层表结构修改(如新增字段),只要视图关联的字段不变,依赖视图的应用无需调整。

创建视图

CREATE VIEW VIEW_USER_PUBLIC AS
SELECT USER_ID, USER_NAME, PHONE FROM USER_INFO;

3. 索引

索引是依附于表的辅助对象,通过构建 “字段值 - 数据位置” 的映射关系,让数据库快速定位目标数据,避免全表扫描(逐行查找数据),大幅提升查询效率。

关键特性

1.依赖表字段:需基于表的一个或多个字段创建,查询时若 SQL 的WHERE条件包含索引字段,数据库会自动使用索引。

2.类型多样:Oracle 11g 支持多种索引类型,常见的有:​

普通索引(B-Tree Index):适用于等值查询(如WHERE USER_ID=100)和范围查询(如WHERE AGE BETWEEN 20 AND 30),是最常用的类型。​

唯一索引(Unique Index):与 “唯一约束” 配合,确保索引字段值唯一,同时提升查询速度。​

位图索引(Bitmap Index):适用于字段值重复率高的场景(如 “性别”“状态” 列),占用空间小,但不适合频繁修改的表。

创建普通索引

CREATE INDEX IDX_USER_NAME ON USER_INFO(USER_NAME);

删除索引

DROP INDEX IDX_USER_NAME;

4. 序列

序列是独立于表的数据库对象,用于生成连续且唯一的数字序列,主要作用是为表的主键(如 ID 列)自动赋值,避免手动输入导致的重复或空缺。

关键特性

1.独立性:不依赖任何表,可被多个表共用(如用同一个序列给 “用户表” 和 “订单表” 的主键赋值)。

2.可配置性:创建时可设置起始值(START WITH)、步长(INCREMENT BY)、最大值(MAXVALUE)等参数。​

3.调用方式:通过NEXTVAL(获取下一个序列值)和CURRVAL(获取当前序列值)调用,首次使用需先执行NEXTVAL。

创建序列(为用户表主键生成自增 ID,起始值 1,步长 1,无最大值):

CREATE SEQUENCE SEQ_USER_ID
START WITH 1          -- 起始值
INCREMENT BY 1        -- 步长(每次+1)
NOCYCLE               -- 达到最大值后不循环
NOCACHE;              -- 不缓存序列值(避免数据库重启后序列值跳号)

使用序列(插入数据时,用序列给主键赋值):

INSERT INTO USER_INFO (USER_ID, USER_NAME, PHONE)
VALUES (SEQ_USER_ID.NEXTVAL, '张三', '13800138000');

5. 存储过程

存储过程是预先编写好并存储在数据库中的 SQL 代码块(可包含查询、插入、更新等操作),通过 “调用” 即可执行,主要用于封装复杂业务逻辑。

关键特性

1.封装性:将多步 SQL 操作(如 “创建订单” 需同时插入订单表、更新库存表、记录日志表)封装成一个存储过程,简化外部调用。​

2.高效性:存储过程在数据库端执行,减少了应用程序与数据库之间的 SQL 语句传输(尤其适合复杂逻辑),提升执行效率。​

3.可复用性:一次创建后,可被多个应用程序(如 Web 端、APP 端)重复调用,避免重复编写相同 SQL。

创建存储过程(封装 “新增用户” 逻辑,包含插入用户表和记录操作日志):

-- 创建存储过程:新增用户
CREATE OR REPLACE PROCEDURE PRO_ADD_USER(
    p_user_name IN VARCHAR2,  -- 输入参数:用户名
    p_phone IN VARCHAR2,      -- 输入参数:手机号
    p_result OUT VARCHAR2     -- 输出参数:执行结果(成功/失败)
) AS
BEGIN
    -- 插入用户数据
    INSERT INTO USER_INFO (USER_ID, USER_NAME, PHONE)
    VALUES (SEQ_USER_ID.NEXTVAL, p_user_name, p_phone);
    
    -- 记录操作日志(假设存在日志表OPER_LOG)
    INSERT INTO OPER_LOG (LOG_ID, OPER_TYPE, OPER_CONTENT, OPER_TIME)
    VALUES (SEQ_LOG_ID.NEXTVAL, '新增用户', '添加用户:'||p_user_name, SYSDATE);
    
    COMMIT;  -- 提交事务
    p_result := 'success';  -- 设置输出结果为“成功”
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;  -- 出错时回滚事务
        p_result := 'fail: '||SQLERRM;  -- 捕获错误信息并返回
END PRO_ADD_USER;
/

调用存储过程

DECLARE
    v_result VARCHAR2(100);  -- 定义变量接收输出结果
BEGIN
    PRO_ADD_USER('李四', '13900139000', v_result);  -- 调用存储过程
    DBMS_OUTPUT.PUT_LINE(v_result);  -- 输出执行结果
END;
/

6.总结感悟

通过对 Oracle 11g 中表、视图、索引、序列、存储过程这五大核心数据库对象的梳理,我们不难发现,这些对象并非孤立存在,而是相互协作、层层支撑的有机整体。这就要求我们不仅要掌握单个对象的特性与操作,更要学会从整体架构出发,让不同对象 “各司其职”,形成最优的协同效果。

当然,Oracle 11g 的数据库对象体系远不止于此,触发器、同义词、函数等对象同样在特定场景中发挥着重要作用。本次课堂总结只是入门的起点,我们后面要结合实际案例深入实践 —— 比如尝试用表、序列、存储过程搭建一个简单的用户管理系统,或通过索引优化复杂查询的执行效率,在实践中深化对这些知识的理解与运用,真正将理论转化为解决问题的能力。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐