DUAL 是 Oracle 最特殊的系統表:單行、單欄 DUMMY VARCHAR2(1),保證永遠只回傳一筆資料。查詢 SYSDATE、SEQUENCE.NEXTVAL 等無表來源值時必須 FROM DUAL。
| 分類 | 函數 | 範例 | 結果說明 |
|---|---|---|---|
| 大小寫轉換 | LOWER | LOWER('ABC') | 'abc' |
| UPPER | UPPER('abc') | 'ABC' | |
| INITCAP | INITCAP('hello world') | 'Hello World' | |
| 字元操作 | CONCAT / \|\| | CONCAT('A','B') | 'AB' |
| SUBSTR | SUBSTR('ABCDE',1,3) | 'ABC' | |
| LENGTH | LENGTH('我愛你') | 3 (中英皆 2 bytes/char) | |
| INSTR | INSTR('ABCDE','C') | 3 (位置) | |
| LPAD/RPAD | LPAD('X',5,'*') | '****X' |
Oracle 內部**一律以大寫儲存**資料。查詢時若不轉大寫將找不到資料:
SELECT * FROM EMP WHERE ENAME = 'king'; -- 無結果
SELECT * FROM EMP WHERE ENAME = UPPER('king'); -- 正確
-- 預設只有一行
SELECT * FROM DUAL; -- DUMMY='X'
-- 可插入/刪除 (極度不建議刪除,會導致資料庫無法啟動)
INSERT INTO DUAL VALUES ('Y');
INSERT INTO DUAL VALUES ('Z');
SELECT ROWID, DUMMY FROM DUAL ORDER BY DUMMY;
-- 結果顯示三行,但 Oracle 內部邏輯仍視為單行虛擬表
-- 刪除後可設 REPLICATION_DEPENDENCY_TRACKING=FALSE 修復
ROWID、ROWNUM (除 DUAL 無 ROWNUM)。