在PL/SQL中,集合(Collection)是一种复合数据类型,用于存储一组相关的数据项。集合主要有三种类型:关联数组(Associative Arrays)、嵌套表(Nested Tables)和可变数组(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)
可变数组是一种定长数组,存储元素的个数在创建时指定。它们适用于元素数量固定或变化范围较小的情况。
创建和使用可变数组
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;
/
常用操作
无论是哪种类型的集合,它们都支持一些常见的操作:
- 初始化(Initialization):使用构造函数或赋值语句初始化集合。
- 添加元素(Adding Elements) :使用
EXTEND
方法扩展集合的大小,然后赋值。 - 访问元素(Accessing Elements):通过索引或键访问集合中的元素。
- 更新元素(Updating Elements):直接通过索引或键更新集合中的元素。
- 删除元素(Deleting Elements) :使用
DELETE
方法删除集合中的元素。 - 遍历元素(Iterating Elements) :使用
FOR
循环遍历集合中的所有元素。
综合示例
以下示例展示了如何综合使用集合的各种操作。
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程序的数据处理能力和效率。在使用集合时,需要掌握它们的初始化、添加、访问、更新、删除和遍历等基本操作。