当前位置: 首页 > 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程序的数据处理能力和效率。在使用集合时,需要掌握它们的初始化、添加、访问、更新、删除和遍历等基本操作。

相关文章:

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中的一个关键字&#xff0c;用于定义类级别的成员&#xff0c;类级别的成员是指那些属于整个类&#xff0c;而不是特定对象实例的成员。在Java中&#xff0c;类级别的成员包括静态变量…...

使用 Java RestClient 与 Elasticsearch 进行索引管理的示例

文章目录 准备工作测试连接创建索引查询索引是否存在删除索引总结 在这篇博客中&#xff0c;我将和大家分享如何使用 Java RestClient 与 Elasticsearch 进行简单的索引管理操作。如果你在开发过程中需要对海量数据进行高效搜索和分析&#xff0c;Elasticsearch 可能是个不错的…...

编程-设计模式 10:外观模式

设计模式 10&#xff1a;外观模式 定义与目的 定义&#xff1a;外观模式&#xff08;Facade Pattern&#xff09;提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。它定义了一个高层接口&#xff0c;让子系统更容易使用。目的&#xff1a;简化复杂的子系统的使用…...

非范型ArrayList和泛型List<T>

ArrayList 是 C# 中的一个非泛型集合类&#xff0c;它属于 System.Collections 命名空间。它提供了动态数组的功能&#xff0c;允许你在运行时添加、删除和访问元素。然而&#xff0c;需要注意的是&#xff0c;ArrayList 并不是类型安全的&#xff0c;因为你可以向其中添加任何…...

魔众文库系统v7.0.0版本推荐店铺功能,管理菜单逻辑优化

推荐店铺功能&#xff0c;管理菜单逻辑优化 [新功能] RandomImageProvider 逻辑升级重构&#xff0c;支持更丰富的随机图片生成 [新功能] 资源篮订单参数字段 [新功能] 首页推荐店铺功能&#xff0c;需要在后台 文库系统 → 文库店铺 开启推荐 [系统优化] Grid 快捷编辑请求…...

03、流程控制语句

01、位运算符 一、位运算符:是针对二进制数据(补码)的运算。(0看成false&#xff0c;1看成true) &:按位与——求出两个数字对应的二进制&#xff0c;有0则0 | :按位或——求出两个数字对应的二进制&#xff0c;有1则1 ^ :按位异或 ——求出两个数字对应的二进制&#xff0c…...

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment底部遮盖的问题

创建了Bottom Navigation Views Activity之后&#xff0c;在fragment_home.xml&#xff0c;加了一个RecyclerView&#xff0c; 后来添加了item之后发现底部会被盖住一部分。 解决&#xff1a;在layout里面加两句&#xff1a; android:paddingBottom"?attr/actionBarSize&…...

Armv8/Armv9架构中的原子性

B2.2 Arm 架构中的原子性 原子性是内存访问的一个特性,描述为原子访问。Arm 架构描述涉及两种类型的原子性:单次复制原子性和多次复制原子性。在 Arm 架构中,内存访问的原子性要求取决于内存类型,以及访问是显式的还是隐式的。有关更多信息,请参见: 单次复制原子性的要求…...

读零信任网络:在不可信网络中构建安全系统15协议和过滤

1. 协议 1.1. IKE/IPSec 1.1.1. 因特网密钥交换协议&#xff08;Internet Key Exchange,IKE&#xff09;用于执行IPSec认证和密钥交换 1.1.1.1. 通常以后台守护进程的方式实现&#xff0c;使用预共享密钥或X.509证书来认证对端并创建一个安全会话 1.1.2. IKEv1与IKEv2 1.1.2.1…...

C语言学习笔记 Day11(指针--中2)

Day11 内容梳理&#xff1a; 目录 Chapter 7 指针 7.6 指针 & 函数 &#xff08;1&#xff09;形参改变实参的值 &#xff08;2&#xff09;字符数组作为函数参数 1&#xff09;合并字符串 2&#xff09;删掉字符串中空格 &#xff08;3&#xff09;指针作为函数返…...

Golang 并发编程

Golang 并发编程 Goroutine 什么是协程 创建 Goroutine 主 goroutine &#xff08;main函数&#xff09;退出后&#xff0c;其它的工作 goroutine 也会自动退出 package mainimport ("fmt""time" )func myFunc() {i : 0for {ifmt.Println("func: …...

【数据结构详解】——选择排序(动图详解)

目录 &#x1f552; 1. 直接选择排序&#x1f552; 2. 堆排序 &#x1f552; 1. 直接选择排序 &#x1f4a1; 算法思想&#xff1a;第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始&#xff08;末尾&#xff09;位置…...

杂项命令(笔记)

ifconfig &#xff1a;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背包&#xff0c;完全背包的显著特征是每个物品可以用无数次&#xff0c;遍历顺序也不需要为了保证每个物品只去一次而倒序遍历。 #include<iostream> #include<vector> using namespace std; int main(){int N,V;cin>>N>>V…...

超越链端:Web3的无边界技术革命

Web3&#xff0c;作为互联网技术的第三代变革&#xff0c;正以其去中心化、开放透明的特性&#xff0c;重新定义着我们的数字生活。在这一背景下&#xff0c;“链端”概念逐渐成为热点&#xff0c;意味着我们不仅仅局限于区块链技术本身&#xff0c;而是探索其在更广泛领域的应…...

127. Go反射基本原理

文章目录 反射基础 - go 的 interface 是怎么存储的&#xff1f;iface 和 eface 的结构体定义&#xff08;runtime/iface.go&#xff09;&#xff1a;_type 是什么&#xff1f;itab 是什么&#xff1f; 反射对象 - 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一样&#xff0c;在写一个eureka-server的服务了&#xff0c;因为zookeeper本身就是一个服务端&#xff0c;只需要编写需要进行服务注册的客户端即可 依赖 <!-- zookeeper 注册中心 --> <dependency&g…...

SSM+JSP动漫网站源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

为什么钉钉、飞书、企微都在做 CLI?这个开源项目给出了最极致的答案

❝AI Agent 很聪明&#xff0c;但面对真实的专业软件&#xff0c;它就是个"睁眼瞎"。CLI-Anything 说&#xff1a;我来治。❞先说一个扎心的事实2026年了&#xff0c;AI Agent 能写代码、能做分析、能聊天能画画——但你让它打开 Blender 建个模&#xff1f;让它用 G…...

Pixel Aurora Engine应用场景:独立开发者低成本构建像素IP资产库

Pixel Aurora Engine应用场景&#xff1a;独立开发者低成本构建像素IP资产库 1. 像素艺术创作新纪元 在游戏开发领域&#xff0c;像素艺术始终保持着独特的魅力。从早期的《超级马里奥》到现代的《星露谷物语》&#xff0c;像素风格游戏凭借其怀旧感和艺术表现力&#xff0c;…...

SHT31传感器驱动深度解析:I²C高速通信与嵌入式实时采集

1. SHT31传感器库技术解析&#xff1a;面向嵌入式工程师的深度实践指南SHT31是德国Sensirion公司推出的高精度数字温湿度传感器&#xff0c;采用IC接口&#xff0c;具备0.3C温度精度与1.5%RH湿度精度&#xff0c;广泛应用于环境监测、工业控制、智能农业及IoT终端设备。本技术文…...

3步搞定iOS微信聊天记录完整导出:WeChatExporter终极指南

3步搞定iOS微信聊天记录完整导出&#xff1a;WeChatExporter终极指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 还在为无法备份微信聊天记录而烦恼吗&#xff1f;微…...

为什么99%的Python团队还没用上AOT?2026年官方方案的3大硬伤与2个绕过技巧(含patch diff与CI集成脚本)

第一章&#xff1a;Python 原生 AOT 编译方案 2026 概览与演进脉络Python 长期以来以解释执行和 JIT 辅助&#xff08;如 PyPy&#xff09;为主流运行范式&#xff0c;而原生 Ahead-of-Time&#xff08;AOT&#xff09;编译在 2026 年迎来实质性突破&#xff1a;CPython 官方正…...

FastAPI 2.0 + LLM流式输出全栈方案,含OpenAI兼容层、前端SSE重连策略、服务端背压控制(仅限内部技术白皮书级实录)

第一章&#xff1a;FastAPI 2.0 异步 AI 流式响应教程概览FastAPI 2.0 原生强化了对异步流式响应&#xff08;StreamingResponse&#xff09;的支持&#xff0c;为构建低延迟、高吞吐的 AI 接口&#xff08;如大语言模型推理、语音合成、实时图像生成&#xff09;提供了坚实基础…...

芯片缺货潮下的应对策略与国产替代方案

1. 芯片缺货潮下的行业现状最近我的一个产品项目中&#xff0c;原本采购价仅5元的ST品牌MCU&#xff08;微控制器&#xff09;价格飙升至70元&#xff0c;涨幅高达14倍。这个案例并非个例&#xff0c;而是当前全球半导体行业供应链危机的缩影。作为从业十余年的硬件工程师&…...

ReplaceItems:批量设计元素智能替换引擎 — 献给追求极致效率的UI设计师

ReplaceItems&#xff1a;批量设计元素智能替换引擎 — 献给追求极致效率的UI设计师 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 设计效率瓶颈诊断&#xff1a;为何手动替换如此…...

YouTube视频一直转圈?加载卡顿原因分析与排查方法(2026)

在日常开发或使用在线视频平台时&#xff0c;常见一个问题&#xff1a;视频播放过程中出现持续加载、卡顿甚至无法播放的情况。这类问题并不一定由带宽不足引起&#xff0c;而往往与浏览器、网络链路以及设备性能等多方面因素有关。本文从技术角度出发&#xff0c;对视频加载流…...