SQL 本質是面向集合的語言,但現代 Oracle 融入了許多面向對象的特性。本文從游標、Package、集合操作三個維度,探討兩種思維在 Oracle 開發中的體現與融合。
DECLARE
CURSOR students IS SELECT sid, name, age, hobby FROM my_test;
student_rec students%ROWTYPE;
BEGIN
FOR student_rec IN students LOOP
DBMS_OUTPUT.PUT_LINE('學號:' || student_rec.sid || ' 姓名:' || student_rec.name);
END LOOP;
END;
FOR ... IN cursor 語法極類似 C# foreach,student_rec.sid 的屬性存取方式具有強烈的物件導向感覺。
DBMS_OUTPUT.PUT_LINE()、UTL_FILE.FOPEN() 等內建套件,結構上就是「類 + 靜態方法」。自訂 Package 更能實現:
SPEC vs BODY)。關聯式資料庫基於集合論,SQL 旨在聲明式描述「要什麼」而非「怎麼做」。
Oracle 10g+ 採用 CBO,依統計資訊選擇執行計劃。理解存取路徑 (Full Scan, Index Range Scan, Hash Join 等) 是寫出高效 SQL 的前提。
INSERT ... SELECT 取代 PL/SQL 迴圈逐筆插入。UNION, INTERSECT, MINUS 處理集合關係。善用 EXPLAIN PLAN、DBMS_XPLAN.DISPLAY_CURSOR 分析:
「誰都能寫出電腦看懂的代碼,只有有思想的程式設計師才能寫出人人都能看懂的程式碼。」