-- 顯式列插值
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...);
-- 子查詢插入 (跨表複製)
INSERT INTO target_table (col1, col2) SELECT col1, col2 FROM source_table;
'GOOD DAY''' 代表一個單引號SYSDATE (秒級) / TO_DATE('2023-08-01','YYYY-MM-DD') / DATE '2023-08-01' (ANSI)CLOB + DBMS_LOB 包CREATE SEQUENCE seq_t INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE; 使用 seq_t.NEXTVALDELETE FROM table_name WHERE condition;
-- 全表清空 (DDL 隱式提交、不可回滾、釋放空間、重置 HWM)
TRUNCATE TABLE table_name;
核心差異: DELETE 產生 UNDO/REDO、觸發器、不釋放空間;TRUNCATE 直接釋放段空間、極快、無 WHERE。
UPDATE table_name SET col1 = val1, col2 = val2 ... WHERE condition;
陷阱:
NVL(val, default))| 命令 | 作用 |
|---|---|
| COMMIT | 提交事務,釋放鎖,生效變更 |
| ROLLBACK | 回滾事務,撤銷變更,釋放鎖 |
| SAVEPOINT name | 設置保存點,支持部分回滾 |
| ROLLBACK TO name | 回滾至保存點 |
| SET TRANSACTION READ ONLY | 只讀事務 (一致性讀) |
| SELECT ... FOR UPDATE [NOWAIT|WAIT n] | 顯式行鎖 (悲觀鎖) |
LOOP ... DELETE ... COMMIT; EXIT WHEN SQL%ROWCOUNT=0; END LOOP;V$TRANSACTION、V$UNDOSTAT 防 UNDO 爆滿DECLARE
v_deleted NUMBER := 0;
BEGIN
LOOP
DELETE FROM sys_log
WHERE create_time < SYSDATE - 90
AND ROWNUM <= 5000;
v_deleted := v_deleted + SQL%ROWCOUNT;
COMMIT;
EXIT WHEN SQL%ROWCOUNT = 0;
DBMS_LOCK.SLEEP(0.5); -- 降低爭用
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total deleted: ' || v_deleted);
END;
/
總結: DML 三板斧看似簡單,但事務邊界、鎖粒度、批量處理、空值處理才是區分新手與資深開發的分水嶺。養成「先 SELECT 驗證影響範圍、再 DML、小批量 COMMIT」的肌肉記憶。