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;
/
常用操作
无论是哪种类型的集合,它们都支持一些常见的操作:
- 初始化(Initialization):使用构造函数或赋值语句初始化集合。
- 添加元素(Adding Elements):使用
EXTEND方法扩展集合的大小,然后赋值。 - 访问元素(Accessing Elements):通过索引或键访问集合中的元素。
- 更新元素(Updating Elements):直接通过索引或键更新集合中的元素。
- 删除元素(Deleting Elements):使用
DELETE方法删除集合中的元素。 - 遍历元素(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程序的数据处理能力和效率。在使用集合时,需要掌握它们的初始化、添加、访问、更新、删除和遍历等基本操作。
相关文章:
Oracle(47)如何创建和使用集合?
在PL/SQL中,集合(Collection)是一种复合数据类型,用于存储一组相关的数据项。集合主要有三种类型:关联数组(Associative Arrays)、嵌套表(Nested Tables)和可变数组&…...
SpringIOC和SpringAOC
lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…...
static关键字详解
文章目录 static使用示例static底层原理静态初始化顺序静态与线程安全 static static是Java中的一个关键字,用于定义类级别的成员,类级别的成员是指那些属于整个类,而不是特定对象实例的成员。在Java中,类级别的成员包括静态变量…...
使用 Java RestClient 与 Elasticsearch 进行索引管理的示例
文章目录 准备工作测试连接创建索引查询索引是否存在删除索引总结 在这篇博客中,我将和大家分享如何使用 Java RestClient 与 Elasticsearch 进行简单的索引管理操作。如果你在开发过程中需要对海量数据进行高效搜索和分析,Elasticsearch 可能是个不错的…...
编程-设计模式 10:外观模式
设计模式 10:外观模式 定义与目的 定义:外观模式(Facade Pattern)提供了一个统一的接口,用来访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。目的:简化复杂的子系统的使用…...
非范型ArrayList和泛型List<T>
ArrayList 是 C# 中的一个非泛型集合类,它属于 System.Collections 命名空间。它提供了动态数组的功能,允许你在运行时添加、删除和访问元素。然而,需要注意的是,ArrayList 并不是类型安全的,因为你可以向其中添加任何…...
魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化
推荐店铺功能,管理菜单逻辑优化 [新功能] RandomImageProvider 逻辑升级重构,支持更丰富的随机图片生成 [新功能] 资源篮订单参数字段 [新功能] 首页推荐店铺功能,需要在后台 文库系统 → 文库店铺 开启推荐 [系统优化] Grid 快捷编辑请求…...
03、流程控制语句
01、位运算符 一、位运算符:是针对二进制数据(补码)的运算。(0看成false,1看成true) &:按位与——求出两个数字对应的二进制,有0则0 | :按位或——求出两个数字对应的二进制,有1则1 ^ :按位异或 ——求出两个数字对应的二进制,…...
[Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题
创建了Bottom Navigation Views Activity之后,在fragment_home.xml,加了一个RecyclerView, 后来添加了item之后发现底部会被盖住一部分。 解决:在layout里面加两句: android:paddingBottom"?attr/actionBarSize&…...
Armv8/Armv9架构中的原子性
B2.2 Arm 架构中的原子性 原子性是内存访问的一个特性,描述为原子访问。Arm 架构描述涉及两种类型的原子性:单次复制原子性和多次复制原子性。在 Arm 架构中,内存访问的原子性要求取决于内存类型,以及访问是显式的还是隐式的。有关更多信息,请参见: 单次复制原子性的要求…...
读零信任网络:在不可信网络中构建安全系统15协议和过滤
1. 协议 1.1. IKE/IPSec 1.1.1. 因特网密钥交换协议(Internet Key Exchange,IKE)用于执行IPSec认证和密钥交换 1.1.1.1. 通常以后台守护进程的方式实现,使用预共享密钥或X.509证书来认证对端并创建一个安全会话 1.1.2. IKEv1与IKEv2 1.1.2.1…...
C语言学习笔记 Day11(指针--中2)
Day11 内容梳理: 目录 Chapter 7 指针 7.6 指针 & 函数 (1)形参改变实参的值 (2)字符数组作为函数参数 1)合并字符串 2)删掉字符串中空格 (3)指针作为函数返…...
Golang 并发编程
Golang 并发编程 Goroutine 什么是协程 创建 Goroutine 主 goroutine (main函数)退出后,其它的工作 goroutine 也会自动退出 package mainimport ("fmt""time" )func myFunc() {i : 0for {ifmt.Println("func: …...
【数据结构详解】——选择排序(动图详解)
目录 🕒 1. 直接选择排序🕒 2. 堆排序 🕒 1. 直接选择排序 💡 算法思想:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置…...
杂项命令(笔记)
ifconfig :http://t.csdnimg.cn/gT2AR echo :http://t.csdnimg.cn/6DSoO ps和top的区别 http://t.csdnimg.cn/f1XWt...
代码随想录算法训练营Day38||完全背包问题、leetcode 518. 零钱兑换 II 、 377. 组合总和 Ⅳ 、70. 爬楼梯 (进阶)
一、完全背包问题 相较于01背包,完全背包的显著特征是每个物品可以用无数次,遍历顺序也不需要为了保证每个物品只去一次而倒序遍历。 #include<iostream> #include<vector> using namespace std; int main(){int N,V;cin>>N>>V…...
超越链端:Web3的无边界技术革命
Web3,作为互联网技术的第三代变革,正以其去中心化、开放透明的特性,重新定义着我们的数字生活。在这一背景下,“链端”概念逐渐成为热点,意味着我们不仅仅局限于区块链技术本身,而是探索其在更广泛领域的应…...
127. Go反射基本原理
文章目录 反射基础 - go 的 interface 是怎么存储的?iface 和 eface 的结构体定义(runtime/iface.go):_type 是什么?itab 是什么? 反射对象 - reflect.Type 和 reflect.Value反射三大定律Elem 方法reflect.…...
提高PDF电子书的分辨率
解决方法出处 1. 安装ImageMagick brew install imagemagick brew install ghostscript2. 按流程进行 convert -density 600 your_pdf_filename.pdf output-%02d.jpg convert output*.jpg -normalize -threshold 80% final-%02d.jpg convert final*.jpg my_new_highcontras…...
Spring Cloud全解析:注册中心之zookeeper注册中心
zookeeper注册中心 使用zookeeper作为注册中心就不需要像eureka一样,在写一个eureka-server的服务了,因为zookeeper本身就是一个服务端,只需要编写需要进行服务注册的客户端即可 依赖 <!-- zookeeper 注册中心 --> <dependency&g…...
Pixel Aurora Engine实战应用:像素游戏道具图标(武器/药水/装备)批量生成
Pixel Aurora Engine实战应用:像素游戏道具图标(武器/药水/装备)批量生成 1. 像素游戏道具生成的痛点与解决方案 独立游戏开发者经常面临一个共同挑战:如何高效制作大量风格统一的像素艺术道具图标。传统手工绘制方式存在三个主…...
Ostrakon-VL终端部署案例:单卡3090实现12路摄像头并发扫描
Ostrakon-VL终端部署案例:单卡3090实现12路摄像头并发扫描 1. 项目背景与核心价值 在零售与餐饮行业,传统的图像识别系统往往面临两个痛点:一是工业级UI操作复杂,员工培训成本高;二是多路摄像头并发处理需要昂贵的高…...
C++ 内存管理:从unique_ptr到内存泄漏
引言 在C++编程中,智能指针是管理动态内存的重要工具。它们通过自动管理内存分配和释放,极大减少了程序员的手动管理负担。然而,尽管unique_ptr被设计为一个所有权唯一的智能指针,它仍然可能导致内存泄漏或资源循环引用。本文将通过一个实际例子来探讨unique_ptr如何在不经…...
中医AI革命:如何用70亿参数模型破解千年诊疗难题
中医AI革命:如何用70亿参数模型破解千年诊疗难题 【免费下载链接】CMLM-ZhongJing 首个中医大语言模型——“仲景”。受古代中医学巨匠张仲景深邃智慧启迪,专为传统中医领域打造的预训练大语言模型。 The first-ever Traditional Chinese Medicine large…...
Oracle19c EM Express配置与访问全攻略:从零到可视化管理的实践指南
1. 环境准备与基础检查 第一次接触Oracle 19c EM Express时,很多人会直接跳进配置环节,结果往往被各种报错打得措手不及。我刚开始接触时也犯过这个错误,后来才发现做好前期检查能省去80%的麻烦。下面这些准备工作,建议你逐项打勾…...
WZ文件编辑神器:Harepacker-resurrected从入门到精通的完整指南
WZ文件编辑神器:Harepacker-resurrected从入门到精通的完整指南 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected Harepacker-resu…...
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战 1. 为什么需要调整模型参数? 上周我在用OpenClaw自动处理一批技术文档时,遇到了一个奇怪的现象:同样的任务指令,有时候AI能完美执行,有时候却会输出一堆无…...
ECharts折线图入门学习:从基础到实战的完整指南
引言 折线图是数据可视化中最常用的图表类型之一,特别适合展示数据随时间变化的趋势。ECharts作为一款功能强大的JavaScript可视化库,提供了丰富的配置选项和交互功能,能够轻松创建出专业、美观的折线图。本文将带领大家从零开始学习ECharts折…...
附链小程序测评:支持Word/PDF/PPT/EXCEL/压缩包上传,解决公众号文件嵌入难题
公众号运营中,文件分发存在明确痛点:推文无法直接嵌入附件,第三方链接常出现跳转繁琐、广告弹窗、文件过期等问题,增加运营成本且影响用户体验。附链小程序为微信生态原生工具,核心解决上述痛点,支持公众号…...
小米智能家居跨区域协同控制技术指南
小米智能家居跨区域协同控制技术指南 【免费下载链接】ha_xiaomi_home Xiaomi Home Integration for Home Assistant 项目地址: https://gitcode.com/GitHub_Trending/ha/ha_xiaomi_home 随着智能家居设备数量的快速增长,多区域设备协同工作已成为提升居住体…...
