PL/SQL - 游標:數據操作的入門關卡
你好啊,未來的數據魔法師們!今天,我們將踏上一段令人興奮的旅程,進入 PL/SQL 游標的世界。別擔心如果你是編程新手——我會成為你的友好指導者,我們將一步步探索這個主題。在這個教學結束時,你將像專業人士一樣運用游標!
游標是什麼?
在我們深入之前,讓我們先了解遊標是什麼。想像你在一個自助餐(我知道,這讓你已經開始餓了!)。你有一個餐盤(你的程序),你正在看著所有美味的菜餚(你的數據庫表)。遊標就像你的手——它幫助你從自助餐上拿起特定的項目放在你的餐盤上。在數據庫術語中,遊標允許你從數據庫中一次一行地檢索和操作數據。
現在,讓我們探討 PL/SQL 中的兩種遊標:
隱式遊標
隱式遊標就像你的智能手機相機上的自動功能——它們在背後工作,無需你做太多的事情。當你執行 SQL 語句時,Oracle 會為你創建和管理這些遊標。
讓我們看一個例子:
BEGIN
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 20;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employees received a 10% raise!');
ELSE
DBMS_OUTPUT.PUT_LINE('No employees in department 20 found.');
END IF;
END;
/
在這段代碼中:
- 我們正在更新部門 20 中員工的薪資。
-
SQL%FOUND
是隱式遊標的屬性,如果 UPDATE 影響了任何行則返回 TRUE。 - 我們使用這個屬性來打印一個適當的消息。
其他有用的隱式遊標屬性包括:
-
SQL%ROWCOUNT
:影響的行數 -
SQL%ISOPEN
:對隱式遊標總是返回 FALSE -
SQL%NOTFOUND
:與SQL%FOUND
相反
明式遊標
明式遊標就像相機的手動模式——你有更多的控制權,但你需要自己管理它們。它們在需要逐行處理行或當你想要對數據檢索過程有更多控制時非常完美。
讓我們分解一下明式遊標的生命週期:
宣布遊標
首先,我們需要告訴我們的 PL/SQL 區塊我們想要操作哪些數據。這就像在決定你要在自助餐上吃什麼之前,先填滿你的餐盤。
DECLARE
CURSOR c_emp IS
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30;
在這裡,我們宣佈了一個名為 c_emp
的遊標,它將從部門 30 中提取員工詳情。
打開遊標
現在,我們已經決定了我們想要什麼,該是接近自助餐(或者在我們的情況中,數據庫)的時候了。
OPEN c_emp;
這行代碼告訴 Oracle 執行 SELECT 語句並準備結果集。
提取遊標
這是我們真正開始把食物放在我們餐盤上——或者用編程術語來說,一行一行地检索數據的地方。
DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_last_name employees.last_name%TYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp_id, v_first_name, v_last_name;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_id || ' - ' || v_first_name || ' ' || v_last_name);
END LOOP;
CLOSE c_emp;
END;
/
在這個例子中:
- 我們宣佈變量來保存我們提取的數據。
- 我們打開遊標。
- 我們使用一個循環來逐行提取數據。
- 當沒有更多行時(c_emp%NOTFOUND),我們退出循環。
- 我們打印每個員工的詳情。
關閉遊標
就像你在自助餐吃完後會把你的餐盤還回去一樣,我們在完成遊標使用後也需要關閉它。
CLOSE c_emp;
這會釋放與遊標相關的資源。
游標 FOR 循環:一個捷徑
現在,我有一個小秘密要告訴你。有一種方法可以使使用遊標更加容易——它叫做遊標 FOR 循環。這就像在自助餐有一個幫助你填滿餐盤的好朋友!
BEGIN
FOR emp_rec IN (SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = 30) LOOP
DBMS_OUTPUT.PUT_LINE(emp_rec.employee_id || ' - ' ||
emp_rec.first_name || ' ' ||
emp_rec.last_name);
END LOOP;
END;
/
這個神奇的循環為你做了所有的工作:
- 它宣佈一個記錄變量(
emp_rec
)來保存每一行。 - 它自動打開遊標,提取每一行,並關閉遊標。
- 你只需要專注於循環內對每一行要做的事情。
游標方法:你的便捷工具包
讓我們總結一下我們可以在遊標中使用的方法,並以一個整潔的表格呈現:
方法 | 描述 |
---|---|
DECLARE | 定義遊標及其 SELECT 語句 |
OPEN | 執行 SELECT 語句並準備結果集 |
FETCH | 從結果集中提取下一行 |
CLOSE | 關閉遊標並釋放資源 |
記住,能力越大,責任越大。在使用完遊標後,總是關閉它們以釋放資源!
至於你,親愛的學生們!你剛剛踏入了 PL/SQL 遊標的世界。用這些概念進行練習,嘗試不同的情節,不久你將能夠像經驗豐富的編程員一樣在數據庫中輕鬆航行。
記住,在編程中,就像在生活中一樣,關鍵是持續學習和嘗試。所以,勇往直前,編寫代碼,犯錯誤,最重要的是,玩得開心!誰知道呢?下一個偉大的數據庫應用程序可能就在你的指尖。快樂編程!
Credits: Image by storyset