Oracle(44)什么是PL/SQL表(PL/SQL Table)?

PL/SQL表(PL/SQL Table)是PL/SQL中的一种集合类型,用于在内存中存储和操作数据。PL/SQL表可以看作是数组的增强版,提供了更灵活的数据操作能力。PL/SQL表主要有三种类型:

  1. Associative Arrays(关联数组)
  2. Nested Tables(嵌套表)
  3. VARRAYs(可变数组)

1. 关联数组(Associative Arrays)

关联数组(也称为索引表)是键值对形式的集合,键可以是字符串或数字。它们非常适合用于需要快速查找和更新的情况。

示例:使用关联数组
sql 复制代码
DECLARE
    TYPE employee_salary_type IS TABLE OF NUMBER INDEX BY VARCHAR2(50);
    employee_salaries employee_salary_type;
BEGIN
    -- 添加数据
    employee_salaries('John') := 5000;
    employee_salaries('Jane') := 6000;
    employee_salaries('Alice') := 7000;

    -- 访问数据
    DBMS_OUTPUT.PUT_LINE('Salary of John: ' || employee_salaries('John'));
    DBMS_OUTPUT.PUT_LINE('Salary of Jane: ' || employee_salaries('Jane'));

    -- 更新数据
    employee_salaries('John') := 5500;
    DBMS_OUTPUT.PUT_LINE('Updated salary of John: ' || employee_salaries('John'));

    -- 删除数据
    employee_salaries.DELETE('Jane');
    IF employee_salaries.EXISTS('Jane') THEN
        DBMS_OUTPUT.PUT_LINE('Salary of Jane: ' || employee_salaries('Jane'));
    ELSE
        DBMS_OUTPUT.PUT_LINE('Jane''s salary record does not exist.');
    END IF;
END;
/

2. 嵌套表(Nested Tables)

嵌套表是一种无界数组,可以存储任意数量的元素。它们适用于需要动态调整大小的集合。

示例:使用嵌套表
sql 复制代码
DECLARE
    TYPE employee_name_type IS TABLE OF VARCHAR2(50);
    employee_names employee_name_type;
BEGIN
    -- 初始化嵌套表
    employee_names := employee_name_type('John', 'Jane', 'Alice');

    -- 添加数据
    employee_names.EXTEND;
    employee_names(4) := 'Bob';

    -- 访问数据
    FOR i IN 1..employee_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE('Employee ' || i || ': ' || employee_names(i));
    END LOOP;

    -- 更新数据
    employee_names(2) := 'Janet';
    DBMS_OUTPUT.PUT_LINE('Updated Employee 2: ' || employee_names(2));

    -- 删除数据
    employee_names.DELETE(3);
    FOR i IN 1..employee_names.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE('Employee ' || i || ': ' || employee_names(i));
    END LOOP;
END;
/

3. 可变数组(VARRAYs)

可变数组(VARRAYs)是一种定长数组,存储元素的个数在创建时指定。它们适用于元素数量固定或变化范围较小的情况。

示例:使用可变数组
sql 复制代码
DECLARE
    TYPE employee_id_varray IS VARRAY(5) OF NUMBER;
    employee_ids employee_id_varray := employee_id_varray(1, 2, 3);
BEGIN
    -- 添加数据
    employee_ids.EXTEND;
    employee_ids(4) := 4;

    -- 访问数据
    FOR i IN 1..employee_ids.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE('Employee ID ' || i || ': ' || employee_ids(i));
    END LOOP;

    -- 更新数据
    employee_ids(2) := 5;
    DBMS_OUTPUT.PUT_LINE('Updated Employee ID 2: ' || employee_ids(2));

    -- 删除数据
    employee_ids.DELETE(3);
    FOR i IN 1..employee_ids.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE('Employee ID ' || i || ': ' || employee_ids(i));
    END LOOP;
END;
/

PL/SQL 表的常用操作

无论是哪种类型的PL/SQL表,它们都支持一些常见的操作:

  1. 初始化(Initialization):使用构造函数或赋值语句初始化表。
  2. 添加元素(Adding Elements) :使用EXTEND方法扩展表的大小,然后赋值。
  3. 访问元素(Accessing Elements):通过索引或键访问表中的元素。
  4. 更新元素(Updating Elements):直接通过索引或键更新表中的元素。
  5. 删除元素(Deleting Elements) :使用DELETE方法删除表中的元素。
  6. 遍历元素(Iterating Elements) :使用FOR循环遍历表中的所有元素。

示例:综合使用PL/SQL表

以下示例展示了如何综合使用PL/SQL表的各种操作。

sql 复制代码
DECLARE
    TYPE employee_record IS RECORD (
        employee_id NUMBER,
        first_name VARCHAR2(50),
        last_name VARCHAR2(50),
        salary NUMBER
    );
    
    TYPE employee_table_type IS TABLE OF employee_record INDEX BY PLS_INTEGER;
    employee_table employee_table_type;
    
    v_employee employee_record;
    i PLS_INTEGER;
BEGIN
    -- 添加数据
    employee_table(1).employee_id := 1;
    employee_table(1).first_name := 'John';
    employee_table(1).last_name := 'Doe';
    employee_table(1).salary := 5000;
    
    employee_table(2).employee_id := 2;
    employee_table(2).first_name := 'Jane';
    employee_table(2).last_name := 'Smith';
    employee_table(2).salary := 6000;
    
    -- 访问数据
    FOR i IN 1..employee_table.COUNT LOOP
        v_employee := employee_table(i);
        DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee.employee_id || 
                             ', Name: ' || v_employee.first_name || ' ' || v_employee.last_name ||
                             ', Salary: ' || v_employee.salary);
    END LOOP;
    
    -- 更新数据
    employee_table(1).salary := 5500;
    DBMS_OUTPUT.PUT_LINE('Updated Salary of Employee 1: ' || employee_table(1).salary);
    
    -- 删除数据
    employee_table.DELETE(2);
    IF employee_table.EXISTS(2) THEN
        DBMS_OUTPUT.PUT_LINE('Employee 2 still exists.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('Employee 2 has been deleted.');
    END IF;
    
    -- 遍历剩余数据
    FOR i IN 1..employee_table.COUNT LOOP
        v_employee := employee_table(i);
        DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee.employee_id || 
                             ', Name: ' || v_employee.first_name || ' ' || v_employee.last_name ||
                             ', Salary: ' || v_employee.salary);
    END LOOP;
END;
/

总结

PL/SQL表是PL/SQL中非常强大的数据结构,用于在内存中存储和操作数据。它们包括关联数组、嵌套表和可变数组三种类型,每种类型都有其独特的特点和适用场景。通过合理使用PL/SQL表,可以显著提高PL/SQL程序的数据处理能力和效率。在使用PL/SQL表时,需要掌握它们的初始化、添加、访问、更新、删除和遍历等基本操作。

相关推荐
2601_962683898 小时前
治理遗留系统中的“生肉 SQL”:一次用多模型协作优化慢查询的实战复盘
数据库·人工智能·sql
酱学编程9 小时前
【从零到一实现一个 AI Agent 框架 · 第四篇】04. 任务规划:拆解复杂目标 -
服务器·网络·数据库·人工智能
shushangyun_10 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
dexi.Chi 攻城狮10 小时前
SQL层次查询语法
经验分享·笔记·sql
华山令狐虫11 小时前
DBAPI AI 写 SQL:支持动态 SQL 与参数占位符,自然语言一键生成
数据库·人工智能·sql·dbapi
IvorySQL11 小时前
PG 技术日报|2026-07-04
数据库·人工智能·postgresql·开源
Hoxy.R12 小时前
KingbaseES读写分离高可用集群扩容、备库重建与故障切换实战
运维·数据库
IvorySQL12 小时前
IvorySQL HTAP 实时湖仓接入引擎
数据库·postgresql·开源·htap·ivorysql
忧郁的紫菜12 小时前
WCF+JSON+实体对象与WebService+DataSet效率大比拼
数据库·oracle·json
IvorySQL12 小时前
PostgreSQL 技术日报|2026-07-05
数据库·postgresql