本文匯總 31 個涵蓋架構、SQL 優化、PL/SQL、管理維護的高頻知識點,適合面試複習與日常查閱。
CURSOR c IS SELECT ... → OPEN → FETCH → CLOSE,處理多行查詢。SQL%ROWCOUNT、SQL%FOUND 等。| 特性 | Function | Procedure |
|---|---|---|
| 返回值 | 必須有 RETURN,無 OUT 參數模式 | 可無返回值,用 OUT/IN OUT 返回多值 |
| SQL 中調用 | 可直接在 SELECT/WHERE 中使用 | 不可在 SQL 語句中直接調用 |
| 適用場景 | 計算、轉換、單值查詢 | 複雜業務邏輯、批次處理、多步驟事務 |
exp/imp:二進制格式,版本相容性強,適合跨平台遷移。EXISTS 替代 IN、批次處理減少提交、錯峰執行耗時作業。Oracle 使用 || 操作符:'abc' || 'd' → 'abcd'。
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM tabName WHERE ...
) a WHERE ROWNUM <= 20
) WHERE rn > 10;
CLOB:字元大物件;NCLOB:Unicode 字元;BLOB:二進位;BFILE:外部檔案引用。WHERE 條件、JOIN 條件、GROUP BY、ORDER BY、聚合函數均可用到索引;複合索引需注意最左前綴原則。
OS 排程(cron/Windows Task)呼叫 expdp/rman 腳本。
| 維度 | 冷備份 | 熱備份 |
|---|---|---|
| 前提 | 資料庫正常關閉 | 資料庫開啟,歸檔模式 |
| 速度 | 極快(檔案複製) | 較慢 |
| 恢復點 | 僅至備份時間點 | 可至任意時間點(秒級) |
| 業務影響 | 停機 | 零停機 |
| 粒度 | 整庫 | 表空間/資料檔/區塊級 |
TRUNCATE:DDL、不產生 Redo/Undo、釋放 High Water Mark、不可回滾、速度極快、不觸發 Trigger。DELETE:DML、產生 Undo、保留 HWM、可回滾、觸發 Trigger。-- 找出被鎖物件與 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#';
LENGTH, LOWER, UPPER, TO_DATE, TO_CHAR, LTRIM, RTRIM, SUBSTR, ADD_MONTHS, TO_NUMBER 等。
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 資源、維護較難。
-- 標準/唯一/複合/反向鍵索引
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;
ALTER INDEX REBUILD。CREATE VIEW v_name AS SELECT col1, col2 FROM tbl WHERE ...;
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;
EXECUTE IMMEDIATE)。exp/imp 或 expdp/impdp;存儲設備掛載(同平台)。字元型、整數型、複合型(多列)。
LOCK TABLE tbl IN SHARE/EXCLUSIVE MODE [NOWAIT/WAIT n];// 無返回值
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);
ROWID:物理地址,唯一標識行存儲位置。ROWNUM:查詢結果集的邏輯序號。見第 3、20 條總結。
DELETE FROM table t
WHERE t.rowid != (SELECT MAX(t1.rowid) FROM table1 t1 WHERE t1.name = t.name);