PL/SQL 基礎詳解
PL/SQL(Procedural Language for SQL)是 Oracle 數據庫中的一種過程式語言,它擴展了 SQL 的功能,允許開發者編寫復雜的程序邏輯。
一、匿名塊
解釋
匿名塊是 PL/SQL 的基本執行單位,它是一段獨立的 PL/SQL 代碼,沒有名稱,不能被其他程序調用,主要用于測試和臨時操作。
語法格式
[DECLARE]-- 聲明變量、游標等
BEGIN-- 執行 SQL 語句和 PL/SQL 代碼
EXCEPTION-- 處理異常
END;
使用
DECLAREnum NUMBER := 10;
BEGINDBMS_OUTPUT.PUT_LINE('num = ' || num);
END;
二、存儲過程
解釋
存儲過程是一組為了完成特定功能的 SQL 語句集,經編譯后存儲在數據庫中,可以通過名稱調用執行。
語法格式
CREATE [OR REPLACE] PROCEDURE 過程名 (參數列表)
IS-- 聲明部分
BEGIN-- 執行部分
EXCEPTION-- 異常處理部分
END;
使用
CREATE OR REPLACE PROCEDURE add_proc (a IN NUMBER, b IN NUMBER, c OUT NUMBER)
IS
BEGINc := a + b;
END;
三、函數
解釋
函數與存儲過程類似,但函數必須返回一個值,通常用于計算并返回結果。
語法格式
CREATE [OR REPLACE] FUNCTION 函數名 (參數列表)
RETURN 返回類型
IS-- 聲明部分
BEGIN-- 執行部分RETURN 返回值;
EXCEPTION-- 異常處理部分
END;
使用
CREATE OR REPLACE FUNCTION max_proc (a IN NUMBER, b IN NUMBER)
RETURN NUMBER
IS
BEGINIF a > b THENRETURN a;ELSERETURN b;END IF;
END;
四、觸發器
解釋
觸發器是當對表進行某種操作(如 INSERT、UPDATE、DELETE)時自動執行的 PL/SQL 程序。
語法格式
CREATE [OR REPLACE] TRIGGER 觸發器名
{BEFORE | AFTER} 觸發事件
ON 表名
[FOR EACH ROW]
DECLARE-- 聲明部分
BEGIN-- 執行部分
END;
使用
CREATE OR REPLACE TRIGGER update_trigger
AFTER UPDATE ON employees
FOR EACH ROW
BEGINDBMS_OUTPUT.PUT_LINE('員工信息已更新');
END;
五、變量聲明和數據類型
解釋
在 PL/SQL 中,可以在 DECLARE 部分聲明變量,并為其指定數據類型,用于存儲臨時數據。
語法格式
DECLARE變量名 數據類型;
使用
DECLAREnum NUMBER(5);name VARCHAR2(20);hiredate DATE;
BEGINnum := 100;name := '張三';hiredate := SYSDATE;
END;
六、條件語句
解釋
條件語句用于根據不同的條件執行不同的代碼塊,實現分支邏輯。
語法格式
IF 條件 THEN-- 語句塊 1
ELSIF 條件 THEN-- 語句塊 2
ELSE-- 語句塊 3
END IF;
使用
DECLAREnum NUMBER := 60;
BEGINIF num >= 60 THENDBMS_OUTPUT.PUT_LINE('及格');ELSEDBMS_OUTPUT.PUT_LINE('不及格');END IF;
END;
七、循環語句
解釋
循環語句用于重復執行一段代碼,直到滿足特定條件為止。
語法格式
-- 基本循環
LOOP-- 語句塊EXIT WHEN 條件;
END LOOP;-- WHILE 循環
WHILE 條件 LOOP-- 語句塊
END LOOP;-- FOR 循環
FOR 循環變量 IN 范圍 LOOP-- 語句塊
END LOOP;
使用
DECLAREnum NUMBER := 1;
BEGINWHILE num <= 5 LOOPDBMS_OUTPUT.PUT_LINE(num);num := num + 1;END LOOP;
END;
八、游標
解釋
游標用于處理 SELECT 語句返回的多行記錄,允許逐行處理查詢結果。
語法格式
-- 聲明游標
CURSOR 游標名 ISSELECT 語句;-- 打開游標
OPEN 游標名;-- 提取數據
FETCH 游標名 INTO 變量;-- 關閉游標
CLOSE 游標名;
使用
DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employees;emp_record emp_cursor%ROWTYPE;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO emp_record;EXIT WHEN emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(emp_record.employee_id || ' ' || emp_record.last_name);END LOOP;CLOSE emp_cursor;
END;
九、異常處理
解釋
異常處理用于處理程序運行時出現的錯誤,確保程序的健壯性和穩定性。
語法格式
BEGIN-- 代碼
EXCEPTIONWHEN 異常名 THEN-- 處理代碼WHEN OTHERS THEN-- 處理代碼
END;
使用
DECLAREnum NUMBER := 0;
BEGINIF num = 0 THENRAISE DIVIDE_BY_ZERO;END IF;
EXCEPTIONWHEN DIVIDE_BY_ZERO THENDBMS_OUTPUT.PUT_LINE('除數不能為零');
END;
十、內置函數
解釋
PL/SQL 提供了豐富的內置函數,用于處理字符串、數值、日期等數據類型。
語法格式
函數名(參數);
使用
DECLAREstr VARCHAR2(20) := 'Hello, World!';
BEGINDBMS_OUTPUT.PUT_LINE(LENGTH(str)); -- 計算字符串長度DBMS_OUTPUT.PUT_LINE(UPPER(str)); -- 將字符串轉換為大寫
END;
十一、存儲過程和函數的調用
解釋
存儲過程和函數可以通過特定的語法進行調用,以執行其內部的邏輯。
語法格式
-- 調用存儲過程
EXECUTE 存儲過程名(參數);-- 調用函數
函數名(參數);
使用
-- 調用存儲過程
EXECUTE add_proc(10, 20, :result);-- 調用函數
DECLAREmax_num NUMBER;
BEGINmax_num := max_proc(10, 20);DBMS_OUTPUT.PUT_LINE('最大值為:' || max_num);
END;