当前位置: 首页 > news >正文

Oracle(47)如何创建和使用集合?

在PL/SQL中,集合(Collection)是一种复合数据类型,用于存储一组相关的数据项。集合主要有三种类型:关联数组(Associative Arrays)、嵌套表(Nested Tables)和可变数组(VARRAYs)。以下是如何创建和使用每种类型集合的详细说明和示例代码。

1. 关联数组(Associative Arrays)

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

创建和使用关联数组
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') THENDBMS_OUTPUT.PUT_LINE('Salary of Jane: ' || employee_salaries('Jane'));ELSEDBMS_OUTPUT.PUT_LINE('Jane''s salary record does not exist.');END IF;
END;
/

2. 嵌套表(Nested Tables)

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

创建和使用嵌套表
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 LOOPDBMS_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 LOOPDBMS_OUTPUT.PUT_LINE('Employee ' || i || ': ' || employee_names(i));END LOOP;
END;
/

3. 可变数组(VARRAYs)

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

创建和使用可变数组
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 LOOPDBMS_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 LOOPDBMS_OUTPUT.PUT_LINE('Employee ID ' || i || ': ' || employee_ids(i));END LOOP;
END;
/

常用操作

无论是哪种类型的集合,它们都支持一些常见的操作:

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

综合示例

以下示例展示了如何综合使用集合的各种操作。

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 LOOPv_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) THENDBMS_OUTPUT.PUT_LINE('Employee 2 still exists.');ELSEDBMS_OUTPUT.PUT_LINE('Employee 2 has been deleted.');END IF;-- 遍历剩余数据FOR i IN 1..employee_table.COUNT LOOPv_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程序的数据处理能力和效率。在使用集合时,需要掌握它们的初始化、添加、访问、更新、删除和遍历等基本操作。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Leetcode面试经典150题-236.二叉树的最低公共祖先
  • 保研考研机试攻略:第二章——入门经典(2)
  • LVS(Linux virual server)
  • 排序算法——插入排序
  • “华为杯”第十六届中国研究生数学建模竞赛-C题:视觉情报信息分析
  • rust pin_project的使用
  • 算法经典题目:Insert Interval
  • 深入了解HTML链接:从基础到进阶——WEB开发系列06
  • C# 不使用 `async` 和 `await` 的常见场景
  • STC-ISP升级MCU
  • HCIE学习笔记:IPV6 地址、ICMP V6、NDP 、DAD (更新补充中)
  • 【路由器】RT-AC88U华硕配置DNS
  • 博客标题: 在 Spring Boot 中使用策略模式实现灵活的订单处理
  • 经纬恒润荣获小米汽车优秀质量奖!
  • SpringBoot统一功能处理——统一数据返回格式
  • 【译】JS基础算法脚本:字符串结尾
  • css属性的继承、初识值、计算值、当前值、应用值
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • JS字符串转数字方法总结
  • Redis的resp协议
  • redis学习笔记(三):列表、集合、有序集合
  • SpringCloud集成分布式事务LCN (一)
  • Webpack 4 学习01(基础配置)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从0到1:PostCSS 插件开发最佳实践
  • 对JS继承的一点思考
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 时间复杂度与空间复杂度分析
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​批处理文件中的errorlevel用法
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #AngularJS#$sce.trustAsResourceUrl
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #LLM入门|Prompt#3.3_存储_Memory
  • #NOIP 2014# day.2 T2 寻找道路
  • #数据结构 笔记一
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (回溯) LeetCode 131. 分割回文串
  • (南京观海微电子)——I3C协议介绍
  • (转) ns2/nam与nam实现相关的文件
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作