PL/SQL - 集合:高效數據處理的關卡

你好啊,有抱負的 PL/SQL 開發者們!我很興奮能夠引導你們進入 PL/SQL 集合的迷人世界。作為你們友善的鄰居計算機老師,並且擁有多年經驗,我承諾將這段旅程變得既啟發性又樂趣無窮。所以,拿起你們的虛擬筆記本,讓我們一起深入探討吧!

PL/SQL - Collections

PL/SQL 集合是什麼?

在我們深入細節之前,讓我們先了解集合是什麼。想像你正在籌備一個生日派對,並需要記錄所有來賓的名字。難道將每個名字寫在張紙上,不會比擁有一個單一的名單更容易嗎?這正是 PL/SQL 中的集合所做的——它們讓我們能將相關數據組織在一起。

現在,讓我們探討 PL/SQL 提供我們的集合類型。

索引表(關聯數組)

索引表,也被稱為關聯數組,就像一本神奇的地址簿。它不僅僅存儲名字,還可以將每個名字與其他信息相關聯。

宣布一個索引表

讓我們創建我們的第一個索引表:

DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);
guest_list guest_list_type;
BEGIN
guest_list('Alice') := '帶來蛋糕';
guest_list('Bob') := '帶來氣球';
guest_list('Charlie') := '帶來音樂';

DBMS_OUTPUT.PUT_LINE('Alice 是 ' || guest_list('Alice'));
END;

在這個例子中,我們創建了一個來賓名單,其中每個來賓(索引)都與他們帶來的派對物品相關聯。當我們運行這段代碼時,它將輸出:"Alice 是 帶來蛋糕"。

遍歷索引表

現在,讓我們看看我們如何遍歷來賓名單:

DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50) INDEX BY VARCHAR2(20);
guest_list guest_list_type;
guest VARCHAR2(20);
BEGIN
guest_list('Alice') := '帶來蛋糕';
guest_list('Bob') := '帶來氣球';
guest_list('Charlie') := '帶來音樂';

guest := guest_list.FIRST;
WHILE guest IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(guest || ' 是 ' || guest_list(guest));
guest := guest_list.NEXT(guest);
END LOOP;
END;

這段代碼將列出我們所有的來賓和他們帶來的物品。這就像是在檢查你的派對清單!

嵌套表

嵌套表就像是可以擴展的清單。想像你正在計劃多個派對,每個派對都有自己的來賓名單,這個名單可以增長或縮小。

宣布和初始化嵌套表

讓我們為我們的派對計劃創建一個嵌套表:

DECLARE
TYPE guest_list_type IS TABLE OF VARCHAR2(50);
birthday_party guest_list_type := guest_list_type('Alice', 'Bob', 'Charlie');
BEGIN
DBMS_OUTPUT.PUT_LINE('第一個來賓:' || birthday_party(1));
birthday_party.EXTEND;
birthday_party(4) := 'David';
DBMS_OUTPUT.PUT_LINE('新來賓:' || birthday_party(4));
END;

在這裡,我們從三個來賓開始,然後添加了第四個。輸出將顯示 "第一個來賓:Alice" 和 "新來賓:David"。

集合方法

集合帶有內置方法,讓我們的生活更輕鬆。將這些方法視為處理我們名單的特殊能力。

常見集合方法

以下是一些常見集合方法的表格:

方法 描述
COUNT 返回元素數量
FIRST 返回第一個元素的索引
LAST 返回最後一個元素的索引
NEXT 返回下一個元素的索引
PRIOR 返回前一個元素的索引
EXISTS 檢查特定索引處是否存在元素
EXTEND 在集合末尾添加一個或多個元素
TRIM 從集合末尾刪除一個或多個元素
DELETE 從集合中刪除元素

讓我們看看其中一些方法是如何工作的:

DECLARE
TYPE number_list_type IS TABLE OF NUMBER;
numbers number_list_type := number_list_type(10, 20, 30, 40, 50);
BEGIN
DBMS_OUTPUT.PUT_LINE('元素數量:' || numbers.COUNT);
DBMS_OUTPUT.PUT_LINE('第一個元素:' || numbers(numbers.FIRST));
DBMS_OUTPUT.PUT_LINE('最後一個元素:' || numbers(numbers.LAST));

numbers.DELETE(3);  -- 刪除第三個元素

IF NOT numbers.EXISTS(3) THEN
DBMS_OUTPUT.PUT_LINE('元素 3 不再存在!');
END IF;
END;

這段代碼演示了計算元素數量、訪問第一個和最後一個元素、刪除元素以及檢查元素是否存在。

集合異常

即使是最周密的計劃也可能會出差錯,對集合來說也是如此。PL/SQL 提供了特定的異常來幫助我們優雅地處理集合相關錯誤。

常見集合異常

異常 描述
COLLECTION_IS_NULL 當嘗試在空集合上操作時觸發
NO_DATA_FOUND 當訪問不存在的元素時觸發
SUBSCRIPT_BEYOND_COUNT 當訪問超出當前大小的元素時觸發
SUBSCRIPT_OUTSIDE_LIMIT 當使用超出允許範圍的索引時觸發

讓我們看看我們如何處理這些異常:

DECLARE
TYPE number_list_type IS TABLE OF NUMBER;
numbers number_list_type;
BEGIN
-- 這將引發 COLLECTION_IS_NULL
numbers(1) := 10;
EXCEPTION
WHEN COLLECTION_IS_NULL THEN
DBMS_OUTPUT.PUT_LINE('哦哦!集合是空的。讓我們初始化它。');
numbers := number_list_type(10, 20, 30);
DBMS_OUTPUT.PUT_LINE('現在我們有 ' || numbers.COUNT || ' 個元素。');
END;

這段代碼嘗試將元素添加到空集合中,捕捉異常,然後正確初始化集合。

總結來說,PL/SQL 集合是強大的工具,讓我們能夠有效地管理數據組。無論你是計劃派對還是處理複雜的數據庫操作,掌握集合將使你的 PL/SQL 旅程更加順暢。

記住,熟能生巧!嘗試創建你自己的集合,嘗試不同的方法,並不要害怕異常——它們在那裡幫助你學習並編寫更健壯的代碼。

祝快樂編程,未來的 PL/SQL 巫師們!

Credits: Image by storyset