首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 核心知識點大全:31 個高頻面試與實戰題解析

     編輯:Oracle 教學

Oracle 核心知識體系總覽

本文匯總 31 個涵蓋架構、SQL 優化、PL/SQL、管理維護的高頻知識點,適合面試複習與日常查閱。

一、架構與平台差異

1. Oracle vs SQL Server 2005

  • 宏觀:Oracle 多平台支援(Linux/Unix/Windows),SQL Server 僅 Windows;PL/SQL vs T-SQL 腳本語言差異。
  • 微觀:資料類型、儲存結構、鎖機制、優化器實現均有不同。

二、PL/SQL 程式設計

2. 游標分類與操作

  • 顯式游標:CURSOR c IS SELECT ... → OPEN → FETCH → CLOSE,處理多行查詢。
  • 隱式游標:DML(INSERT/UPDATE/DELETE)及單行 SELECT 自動建立,屬性 SQL%ROWCOUNT、SQL%FOUND 等。

3. Function vs Procedure

特性FunctionProcedure
返回值必須有 RETURN,無 OUT 參數模式可無返回值,用 OUT/IN OUT 返回多值
SQL 中調用可直接在 SELECT/WHERE 中使用不可在 SQL 語句中直接調用
適用場景計算、轉換、單值查詢複雜業務邏輯、批次處理、多步驟事務

4. 匯入匯出方式

  • exp/imp:二進制格式,版本相容性強,適合跨平台遷移。
  • PL/SQL Developer 等工具:導出 SQL 腳本文本,可讀性強,適合小數據遷移。

5. 核心檔案類型

  • 資料檔(.dbf/.ora)、日誌檔(.log)、控制檔(.ctl)。

三、效能優化

6. 優化雙軌:物理與邏輯

  • 物理:硬體/網路、優化器模式、實例參數(SGA/PGA)、索引設計、表空間分離、分區表。
  • 邏輯:SQL 寫法(綁定變數、避免 *、表連接順序、WHERE 條件順序)、EXISTS 替代 IN、批次處理減少提交、錯峰執行耗時作業。

7. 字串連接

Oracle 使用 || 操作符:'abc' || 'd' → 'abcd'。

8. 分區表優勢

  • 可用性提升(單分區故障不影響全表)、維護彈性、I/O 平衡、查詢/修改並行化、對應用透明。
  • 類型:Range、List、Hash、Composite。

9. 分頁查詢標準寫法

SELECT * FROM (
    SELECT a.*, ROWNUM rn FROM (
        SELECT * FROM tabName WHERE ...
    ) a WHERE ROWNUM <= 20
) WHERE rn > 10;

10. 大物件儲存

  • CLOB:字元大物件;NCLOB:Unicode 字元;BLOB:二進位;BFILE:外部檔案引用。

11. 索引使用場景

WHERE 條件、JOIN 條件、GROUP BY、ORDER BY、聚合函數均可用到索引;複合索引需注意最左前綴原則。

12. 定時備份實現

OS 排程(cron/Windows Task)呼叫 expdp/rman 腳本。

13. ORDER BY 索引使用嚴格條件

  • 排序列必須包含在同一索引中且順序一致;不含 NULL 值;否則全表掃描 + 排序。

四、備份恢復

14. 冷備份 vs 熱備份

維度冷備份熱備份
前提資料庫正常關閉資料庫開啟,歸檔模式
速度極快(檔案複製)較慢
恢復點僅至備份時間點可至任意時間點(秒級)
業務影響停機零停機
粒度整庫表空間/資料檔/區塊級

15. 儲存結構層級

  • Data Block(最小邏輯單位) → Extent(連續 Blocks) → Segment(Extents 集合) → Tablespace(邏輯儲存容器,含多資料檔)。

16. TRUNCATE vs DELETE

  • TRUNCATE:DDL、不產生 Redo/Undo、釋放 High Water Mark、不可回滾、速度極快、不觸發 Trigger。
  • DELETE:DML、產生 Undo、保留 HWM、可回滾、觸發 Trigger。

五、鎖與並發

17. 死鎖檢測與解除

-- 找出被鎖物件與 Session
SELECT b.owner, b.object_name, a.session_id, a.locked_mode
FROM v$locked_object a, dba_objects b
WHERE b.object_id = a.object_id;

SELECT s.username, s.sid, s.serial#, s.logon_time
FROM v$locked_object l, v$session s
WHERE l.session_id = s.sid
ORDER BY s.logon_time;

-- Kill Session
ALTER SYSTEM KILL SESSION 'sid,serial#';

18. DML/DDL/DCL 分類

  • DML:SELECT, INSERT, UPDATE, DELETE
  • DDL:CREATE, ALTER, DROP, TRUNCATE
  • DCL:COMMIT, ROLLBACK, GRANT, REVOKE

19. 常用內建函數

LENGTH, LOWER, UPPER, TO_DATE, TO_CHAR, LTRIM, RTRIM, SUBSTR, ADD_MONTHS, TO_NUMBER 等。

六、進階物件

20. 預存程序與游標範例

CREATE OR REPLACE PROCEDURE proc_xxx (is_ym IN VARCHAR2) AS
  vs_ym_beg CHAR(6); vs_ym_end CHAR(6);
  CURSOR cur_1 IS SELECT area_code, cmcode, SUM(rmb_amt)/10000 rmb_amt_sn ...
  BEGIN
    -- 參數解析、刪除舊數據、插入新數據、游標循環更新、提交、異常處理
  END;

優點:性能(預編譯)、網路流量減少、業務邏輯集中、安全性(權限控制)。
缺點:可移植性差、佔用 Server 資源、維護較難。

21. 索引建立與原則

-- 標準/唯一/複合/反向鍵索引
CREATE INDEX idx_name ON tbl(col) TABLESPACE ts;
CREATE UNIQUE INDEX uq_idx ON tbl(col) TABLESPACE ts;
CREATE INDEX comp_idx ON tbl(col1, col2) TABLESPACE ts;
CREATE INDEX rev_idx ON tbl(col) REVERSE TABLESPACE ts;
  • 原則:高選擇性、常用於 WHERE/JOIN、避免頻繁 DML 列、複合索引最左前綴、定期 ALTER INDEX REBUILD。

22. View 建立與權限

CREATE VIEW v_name AS SELECT col1, col2 FROM tbl WHERE ...;
  • 優點:不佔儲存空間、隱藏敏感列/表結構、簡化複雜查詢。
  • 可對 View 授權(GRANT SELECT ON view TO user),實現行/列級安全。

23. Trigger 語法

CREATE OR REPLACE TRIGGER trig_name
BEFORE/AFTER INSERT/UPDATE/DELETE ON tbl
FOR EACH ROW
BEGIN
  -- PL/SQL 邏輯
  CURSOR c IS SELECT * FROM ...; -- 游標定義
END;

24. 建表方式

  • 圖形工具、DDL 語句、PL/SQL 動態 SQL(EXECUTE IMMEDIATE)。
  • 注意:權限、表空間、命名規範、約束條件。

25. 資料遷移

  • exp/imp 或 expdp/impdp;存儲設備掛載(同平台)。

26. 主鍵類型

字元型、整數型、複合型(多列)。

27. 鎖完整分類

  • 模式:Row Share (RS)、Row Exclusive (RX)、Share (S)、Share Row Exclusive (SRX)、Exclusive (X)。
  • 手動鎖表:LOCK TABLE tbl IN SHARE/EXCLUSIVE MODE [NOWAIT/WAIT n];
  • 分類維度:自動/顯式、共享/排他、DML/DDL/內部 Latch。

七、Java 整合

28. CallableStatement 調用預存程序

// 無返回值
CallableStatement cs = conn.prepareCall("{call proc_a(?,?)}");
cs.setString(1, "1001"); cs.setString(2, "Test"); cs.execute();

// 有 OUT 參數
cs = conn.prepareCall("{call proc_b(?,?)}");
cs.setString(1, "1001"); cs.registerOutParameter(2, Types.VARCHAR);
cs.execute(); String ret = cs.getString(2);

// 返回 ResultSet (需 Package + REF CURSOR)
cs = conn.prepareCall("{? = call pkg.proc_c(?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.execute(); ResultSet rs = (ResultSet) cs.getObject(1);

八、偽列與進階

29. ROWID vs ROWNUM

  • ROWID:物理地址,唯一標識行存儲位置。
  • ROWNUM:查詢結果集的邏輯序號。

30. Procedure/Cursor/Function 差異

見第 3、20 條總結。

31. 刪除重複資料

DELETE FROM table t
WHERE t.rowid != (SELECT MAX(t1.rowid) FROM table1 t1 WHERE t1.name = t.name);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved