嵌套表

嵌套表(Nested Table)是Oracle中的一种集合数据类型,它允许在表中存储多值属性,类似于在表中嵌套另一个表。

嵌套表具有以下特点:

是Oracle对象关系特性的一部分

可以看作是一维数组,没有最大元素数量限制

存储在单独的存储表中,与主表有引用关系

可以包含对象类型或标量类型

-- 创建一个地址对象类型


CREATE TYPE address_type AS OBJECT (street VARCHAR2(50),city VARCHAR2(30),state VARCHAR2(2),zip VARCHAR2(10)
);
/


SELECT OBJECT_NAME, OBJECT_TYPE  FROM USER_OBJECTS  WHERE OBJECT_NAME = 'ADDRESS_TABLE_TYPE'; 
-- 创建一个嵌套表类型,基于address_type

CREATE TYPE address_table_type AS TABLE OF address_type;
/CREATE TABLE customers (customer_id NUMBER,name VARCHAR2(50),addresses address_table_type
) NESTED TABLE addresses STORE AS customer_addresses;

-- 插入数据到嵌套表

INSERT INTO customers VALUES (1, 'John Smith',address_table_type(address_type('123 Main St', 'New York', 'NY', '10001'),address_type('456 Oak Ave', 'Boston', 'MA', '02134'))
);

-- 基本查询
SELECT c.customer_id, c.name, a.street, a.city, a.state, a.zip FROM customers c, TABLE(c.addresses) a;

-- 使用别名简化
SELECT c.customer_id, c.name, addr.* FROM customers c, TABLE(c.addresses) addr;

SELECT table_name, parent_table_name FROM user_nested_tables WHERE parent_table_name = 'CUSTOMERS';

-- 更新整个嵌套表

UPDATE customers
SET addresses = address_table_type(address_type('789 Pine Rd', 'Chicago', 'IL', '60601'),address_type('321 Elm St', 'Denver', 'CO', '80202')
)
WHERE customer_id = 1;

-- 更新嵌套表中的特定元素

UPDATE TABLE(SELECT addresses FROM customers WHERE customer_id = 1
) a
SET a.city = 'Los Angeles'
WHERE a.city = 'New York';


-- 删除嵌套表中的特定元素

DELETE FROM TABLE(SELECT addresses FROM customers WHERE customer_id = 1
) a
WHERE a.city = 'Boston';


-- 在嵌套表存储表上创建索引
CREATE INDEX idx_cust_addr_city ON customer_addresses (city);

--删除嵌套存储表上索引

DROP INDEX idx_cust_addr_city;

嵌套表存储表会自动创建一个系统生成的NESTED_TABLE_ID列,用于与主表关联。
-- 在嵌套表ID上创建索引,默认创建
CREATE INDEX idx_nested_table_id ON customer_addresses (NESTED_TABLE_ID,city);


NESTED_TABLE_ID实际上是与主表的行标识符(ROWID)相关联,虽然基于行标识的概念,但不是直接存储主表的物理ROWID
Oracle使用内部对象标识符(OID)来实现这种关联

-- 查看嵌套表存储表的结构(不显示NESTED_TABLE_ID列)
DESCRIBE customer_addresses;

删除嵌套表
-- 1. 先删除或修改使用该类型的表列
ALTER TABLE employees DROP COLUMN phones;

-- 2. 再删除嵌套表类型
DROP TYPE phone_nt;

-- 3. 最后删除对象类型(如有)
DROP TYPE phone_type;

在PLSQL内使用嵌套表类型

使用 record 与 object 区别 ,record 不能使用构造函数初始化 只能先初始化为null

DECLARE-- 定义数字类型的嵌套表TYPE number_nt IS TABLE OF NUMBER;-- 定义字符串类型的嵌套表TYPE varchar2_nt IS TABLE OF VARCHAR2(100);-- 使用这些类型声明变量v_numbers number_nt := number_nt(1, 3, 5, 7);v_names varchar2_nt := varchar2_nt('Alice', 'Bob', 'Charlie');
BEGINnull;
END;-- 首先创建对象类型 /或者在PLSQL内使用record
CREATE OR REPLACE TYPE emp_obj AS OBJECT (emp_id NUMBER,emp_name VARCHAR2(100),hire_date DATE
);
/DECLARETYPE emp_rec IS RECORD (emp_id    NUMBER,emp_name  VARCHAR2(100),hire_date DATE);TYPE emp_nt IS TABLE OF emp_rec;-- 使用显式字段名初始化v_employees emp_nt := emp_nt();
BEGIN-- 先扩展空间v_employees.EXTEND(2);-- 使用字段名初始化v_employees(1).emp_id := 1;v_employees(1).emp_name := '张三';v_employees(1).hire_date := TO_DATE('2020-01-15', 'YYYY-MM-DD');v_employees(2).emp_id := 2;v_employees(2).emp_name := '李四';v_employees(2).hire_date := TO_DATE('2019-05-20', 'YYYY-MM-DD');-- 输出逻辑...
END;
/


嵌套表初始化

显示初始化

DECLARETYPE num_nt IS TABLE OF NUMBER;-- 方法1: 直接初始化v_nums1 num_nt := num_nt(10, 20, 30);-- 方法2: 先声明后扩展v_nums2 num_nt := num_nt(); -- 空集合
BEGINv_nums2.EXTEND(3); -- 扩展3个元素v_nums2(1) := 100;v_nums2(2) := 200;v_nums2(3) := 300;
END;
/

BULK COLLECT INTO 初始化

DECLARETYPE emp_nt IS TABLE OF employees%ROWTYPE;v_emps emp_nt;
BEGIN-- 批量查询填充SELECT * BULK COLLECT INTO v_emps FROM employees WHERE department_id = 10;-- 处理数据FOR i IN 1..v_emps.COUNT LOOPDBMS_OUTPUT.PUT_LINE(v_emps(i).last_name);END LOOP;
END;

函数返回值初始化

CREATE OR REPLACE FUNCTION get_department_emps(p_dept_id NUMBER
) RETURN emp_nt ISv_result emp_nt;
BEGINSELECT emp_obj(employee_id, last_name, hire_date)BULK COLLECT INTO v_resultFROM employeesWHERE department_id = p_dept_id;RETURN v_result;
END;
/-- 调用示例
DECLAREv_emps emp_nt;
BEGINv_emps := get_department_emps(60);-- 处理结果...
END;

out参数初始化

CREATE OR REPLACE PROCEDURE get_employees(p_dept_id IN NUMBER,p_emps OUT emp_nt
) IS
BEGIN-- 过程内部不需要初始化OUT参数SELECT emp_obj(employee_id, last_name, hire_date)BULK COLLECT INTO p_empsFROM employeesWHERE department_id = p_dept_id;
END;-- 调用时
DECLAREv_emps emp_nt;  -- 调用前不需要初始化
BEGINget_employees(10, v_emps);  -- 过程会处理初始化
END;


如果已经初始化 则覆盖初始化内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87130.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87130.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87130.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习之——单例模式

Python学习之——单例模式 参考1 利用__metaclass__实现单例super的用法class Singleton(type)元类 2 重载__new__方法实现单例模式3 利用装饰器实现单例考虑一个类如果继承一个单例类的问题 参考 python之metaclasssingleton(一) python之metaclasssin…

【Linux】U-boot常用命令总结

U-Boot 是嵌入式系统中常用的引导加载程序(bootloader),它提供了一套命令行接口,用于调试、加载操作系统镜像以及进行硬件测试等操作。 1、变量操作命令 这些命令用于管理 U-Boot 的环境变量。 命令功能说明setenv name value设…

【Linux】不小心又创建了一个root权限账户,怎么将它删除?!

一.前言 今天在学习linux提权的时候,把新建的一个普通账户权限提升成了root, 当我练习完提权,想要把这个账户删掉的时候。 发现… 好家伙,这个根本删不掉 随后试了各种各样的方法,都不行,后来突然想到是否…

数据结构:数组(Array)

目录 什么是数组(Array)? 🔍为什么数组的下标要从 0 开始? 一、内存地址与偏移量的关系:从 0 开始是最自然的映射 二、指针的起点就是第 0 个元素的地址 三、历史原因:BCPL → B → C → …

视频内存太大怎么压缩变小一点?视频压缩的常用方法

视频传生活或者工作中很常见,如发送视频邮件、在线视频播放、视频上传下载等。未压缩的大内存视频文件传输时,不仅会消耗大量的网络带宽资源,还会使传输时间大幅增加。在网速有限的情况下,发送一个几 GB 的未压缩视频可能需要数小…

性能测试包括哪些方面?要掌握哪些知识

性能测试是软件测试中的一个重要方面,它主要关注软件在不同条件下的稳定性、可靠性和性能表现。性能测试包括多个方面,需要掌握的知识也相对广泛。以下是对性能测试包括的方面以及需要掌握的知识分析: 一、性能测试包括的方面 响应时间&…

windows的vscode无法通过ssh连接ubuntu的解决办法

现象: 最近在windows本地通过vscode登录ssh时发现不得劲,总是报错无法与”192.168.1.129“建立连接,如下图: 但是这种报错以及在输出端的信息并没有提供具体错误原因,于是换poweshell来登录,报错如下图&am…

第2章,[标签 Win32] :Windows 的字符串函数

专栏导航 上一篇:第2章 :兼容 ASCII 字符与宽字符的 Windows 函数调用 回到目录 下一篇:无 本节前言 在下面的文章链接里面,我们谈到过,使用兼容版的字符串处理函数的知识。 第2章 :编写兼容多字节字…

Java的SpringAI+Deepseek大模型实战-会话记忆【三】

文章目录 背景项目环境实现步骤第一步、定义会话存储方式方式一、定义记忆存储ChatMemory方式二、注入记忆存储ChatMemory 第二步、配置会话记忆方式一、老版本实现方式二、新版本实现 第三步、添加会话ID 异常处理1、InMemoryChatMemory 无法解析 背景 前两期搭建起大模型对话…

Python3完全新手小白的学习手册 10 文件和异常

文章目录 读取文件读取文件的全部内容 相对路径和绝对路径访问文件中的各行使用文件的内容包含100万位的大型文件圆周率值中包含你的生日吗? 写入文件写入一行写入多行 异常处理ZeroDivisionError异常使用try-except代码块else代码块处理FileNotFoundError异常分析文…

VC Spyglass:工具简介

相关阅读 VC Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828932.html?spm1001.2014.3001.5482 传统上,基于仿真的动态验证技术一直是功能验证的核心方式。随着现代SoC设计日益复杂,静态验证技术的引入变得愈发重要。 Synopsys的 VC Sp…

AWS RDS Aurora全局数据库转区域数据库实战指南:无缝迁移零停机

Aurora全局数据库是AWS提供的跨区域高可用解决方案,但在某些场景下,我们需要将其转换为普通区域数据库。本文将详细介绍这一转换过程,并分享关键技术要点和实战经验。 一、全局数据库与区域数据库概述 AWS RDS Aurora全局数据库是一种跨区域部署的数据库架构,主要用于灾备…

C++之路:函数重载与运算符重载

目录 函数重载运算符重载C运算符重载范围对照表注意事项 运算符重载语法全局运算符重载类内运算符重载下面以一个一元运算符为例,介绍特性1:下面介绍特性3:(必须类内重载的运算符‌) 函数重载 函数重载是指同一个作用域…

七、SpringCloud 项目迁移至 K8s

七、SpringCloud 项目迁移至 K8s 文章目录 七、SpringCloud 项目迁移至 K8s1、环境准备1.1 集群规划1.2 SpringCloud 项目架构及迁移需求分析 2、迁移 Eureka 集群2.1 构建及容器化2.2 部署至 K8s2.3 创建通信Service 3、迁移网关服务3.1 构建及容器化3.2 部署至 K8s3.3 创建Se…

通过具有一致性嵌入的大语言模型实现端到端乳腺癌放射治疗计划制定|文献速递-最新论文分享

Title 题目 End-to-end breast cancer radiotherapy planning via LMMs with consistency embedding 通过具有一致性嵌入的大语言模型实现端到端乳腺癌放射治疗计划制定 01 文献速递介绍 近年来,受大型语言模型(LLM)启发的新一代人工智…

MCP Chart Server服务本地部署案例

一、MCP Chart Server介绍 MCP Chart Server是一个专业的图表生成服务,支持多种图表类型,适用于数据可视化和分析。 MCP Chart Server是一种用于生成和呈现图表的服务器端软件。它提供了一个简单而强大的方式,让开发人员和系统管理员可以轻…

复合型浪涌保护器五大核心技术重构电气防护体系

开篇:从传统防护到智能守护的技术跨越 在电气设备面临浪涌威胁的防护场景中,浪涌保护器(SPD)始终扮演着关键角色。面对传统SPD在漏电流、续流等方面的技术局限,行业领先企业通过技术整合开发出复合型SPD,以…

c# 详细分析Task.sleep和Thread.sleep 的区别、使用场景和应用示例

文章目录 Task.Delay vs Thread.Sleep 详细分析与使用场景核心区别详细分析Thread.SleepTask.Delay 性能考量综合示例高级用法组合延迟与超时实现指数退避重试 总结建议 Task.Delay vs Thread.Sleep 详细分析与使用场景 核心区别 Task.Delay 和 Thread.Sleep 都用于在代码中引…

Vue 3 中的 `h` 函数详解

h 函数是 Vue 3 中用于创建**虚拟 DOM 节点(VNode)**的核心函数,它是 Vue 渲染系统的基石。下面我将全面解释它的作用、用法和重要性。 1. h 函数的基本概念 h 是 createVNode 的简称,来源于"hyperscript"的缩写传统。它的主要作用是&#x…

SoapCore 全面介绍:在 .NET Core 中实现 SOAP 服务的现代解决方案

一、什么是 SoapCore? 在现代微服务和 REST API 成为主流的今天,SOAP(Simple Object Access Protocol)看似已经被边缘化,但在许多企业和政务系统中,SOAP 仍然是 重要的通信协议。特别是在金融、保险、医疗…