oracle集合三嵌套表(Nested Table)學習

嵌套表

嵌套表(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 仍然是 重要的通信協議。特別是在金融、保險、醫療…