游標是Oracle PL/SQL中處理多行查詢結果集的核心機制。本文通過實例深入解析顯性游標、隱性游標及多層游標嵌套的應用場景與實現方式。
開發者顯式聲明、打開、提取、關閉的游標,適用於複雜邏輯控制:
CURSOR cursor_name IS SELECT statement;
...
WHILE cursor_name%FOUND LOOP
...
END LOOP;
Oracle自動管理的游標,用FOR循環簡化操作:
FOR cursor_name IN (SELECT statement) LOOP
...
END LOOP;
當查詢邏輯涉及多級關聯,且後續查詢條件依賴前一層查詢結果(如LIKE模糊匹配)時,多層游標嵌套成為必要選擇。典型場景:訂單號關聯查詢,需先獲取產品訂單號,再按前綴匹配客戶訂單,最後關聯工單表。
DECLARE
v_0 NUMBER;
v_1 NUMBER;
CURSOR c1 IS
SELECT productordernumber
FROM his_productorder@pro_crm
WHERE productid IN (9000045516);
CURSOR c2 IS
SELECT cust_order_id
FROM suf_cust_order_q_his
WHERE cust_order_num LIKE v_0 || '%';
CURSOR c3 IS
SELECT *
FROM suf_work_order_q_his
WHERE cust_order_id = v_1;
BEGIN
FOR i IN c1 LOOP
v_0 := i.productordernumber;
FOR j IN c2 LOOP
v_1 := j.cust_order_id;
FOR k IN c3 LOOP
DBMS_OUTPUT.PUT_LINE(k.work_order_id || ' ' || k.status);
END LOOP;
END LOOP;
END LOOP;
END;
多層游標嵌套雖能解決複雜業務邏輯,但需權衡性能與可維護性。簡單關聯優先用SQL集合操作;確需游標時,注意變量作用域、異常處理及資源釋放,確保代碼健壯高效。