CREATE OR REPLACE PROCEDURE procedure_name (
param1 IN NUMBER,
param2 IN NUMBER
) IS
var1 INTEGER := 0;
var2 DATE;
BEGIN
-- 程式邏輯
NULL;
END procedure_name;
/
CREATE OR REPLACE:建立或覆蓋IN (預設, 唯讀)、OUT (唯寫, 回傳值)、IN OUT (可讀寫)BEGIN...END 為執行區/ 執行BEGIN
SELECT col1, col2 INTO var1, var2
FROM typestruct
WHERE condition;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- 處理無資料情況
var1 := -1;
WHEN TOO_MANY_ROWS THEN
-- 處理多筆資料錯誤
RAISE_APPLICATION_ERROR(-20001, '查詢回傳多筆');
END;
注意:必須且只能回傳 1 筆,否則拋出例外。
IF v_test = 1 THEN
-- do something
ELSIF v_test = 2 THEN
-- do something else
ELSE
-- default
END IF;
WHILE v_test = 1 LOOP
-- 迴圈主體
v_test := v_test + 1; -- 避免無限迴圈
EXIT WHEN v_test > 100; -- 或使用 EXIT WHEN
END LOOP;
v_test := 123; -- 純量賦值
v_date := SYSDATE; -- 日期賦值
v_var := NVL(v_other, 0); -- 運算式賦值
DECLARE
v_sum NUMBER := 0;
BEGIN
FOR rec IN (SELECT col1, col2 FROM table_name WHERE condition) LOOP
v_sum := v_sum + rec.col1 + rec.col2;
DBMS_OUTPUT.PUT_LINE('處理: ' || rec.col1);
END LOOP;
DBMS_OUTPUT.PUT_LINE('總計: ' || v_sum);
END;
優點:自動 OPEN/FETCH/CLOSE,程式碼簡潔。
DECLARE
CURSOR c_user(p_type_id NUMBER) IS
SELECT name FROM users WHERE type_id = p_type_id;
v_name users.name%TYPE;
BEGIN
OPEN c_user(10);
LOOP
FETCH c_user INTO v_name;
EXIT WHEN c_user%NOTFOUND;
-- 處理 v_name
DBMS_OUTPUT.PUT_LINE(v_name);
END LOOP;
CLOSE c_user;
END;
游標屬性:%FOUND、%NOTFOUND、%ROWCOUNT、%ISOPEN
TYPE ref_cur IS REF CURSOR;
c_ref ref_cur;
BEGIN
OPEN c_ref FOR 'SELECT * FROM ' || table_name; -- 動態 SQL
-- 或 OPEN c_ref FOR SELECT * FROM fixed_table;
FETCH c_ref INTO ...;
CLOSE c_ref;
END;
BEGIN my_proc(1, 'test'); END;| 主題 | 關鍵語法 | 說明 |
|---|---|---|
| 函數 | CREATE FUNCTION ... RETURN type IS ... RETURN val; | 必須回傳值,可用於 SQL |
| 套件 | CREATE PACKAGE spec ... CREATE PACKAGE BODY ... | 封裝相關程序/函數/型別 |
| 自治交易 | PRAGMA AUTONOMOUS_TRANSACTION; | 獨立於主交易的子交易 |
| 集合 | TYPE arr IS TABLE OF type INDEX BY BINARY_INTEGER; | PL/SQL 陣列 |
| 動態 SQL | EXECUTE IMMEDIATE 'SQL' USING bind_vars; | 執行字串 SQL |
| 例外處理 | EXCEPTION WHEN OTHERS THEN ... RAISE; | 統一錯誤處理 |
BULK COLLECT + FORALL 批次處理%TYPE、%ROWTYPE 錨定型別,減少維護