標準寫法
SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME = UPPER('your_table_name');
-- 或
SELECT 1 FROM USER_TABLES WHERE TABLE_NAME = UPPER('your_table_name') AND ROWNUM = 1;
說明
- Oracle 資料字典視圖 `USER_TABLES` / `ALL_TABLES` / `DBA_TABLES` 儲存表元資料。
- `TABLE_NAME` 字段**一律大寫儲存** (除非建表時用雙引號 `"MyTable"` 保留大小寫)。
- 查詢時**必須轉大寫** (`UPPER()`) 比對,否則找不到。
- `USER_TABLES` 僅看當前 Schema;`ALL_TABLES` 看可存取;`DBA_TABLES` 看全庫 (需 DBA 權限)。
PL/SQL 封裝函數範例
CREATE OR REPLACE FUNCTION table_exists(p_table_name VARCHAR2, p_owner VARCHAR2 DEFAULT USER)
RETURN BOOLEAN IS
v_cnt PLS_INTEGER;
BEGIN
SELECT COUNT(*) INTO v_cnt
FROM ALL_TABLES
WHERE OWNER = UPPER(p_owner)
AND TABLE_NAME = UPPER(p_table_name);
RETURN v_cnt > 0;
END;
/
-- 使用
BEGIN
IF table_exists('EMP', 'SCOTT') THEN
DBMS_OUTPUT.PUT_LINE('Table exists');
END IF;
END;
常見誤區
- 嘗試用 `SELECT * FROM tab` (舊相容視圖) — 不推薦,已棄用。
- 用 `EXCEPTION WHEN NO_DATA_FOUND` 包裝 `SELECT * FROM table` — 效能極差且會產生遞迴 SQL。
- 忽略大小寫導致誤判表不存在。
擴充:同時檢查視圖/同義詞/序列
SELECT OBJECT_TYPE FROM ALL_OBJECTS
WHERE OWNER = UPPER(:owner)
AND OBJECT_NAME = UPPER(:name)
AND OBJECT_TYPE IN ('TABLE','VIEW','SYNONYM','SEQUENCE','PROCEDURE','FUNCTION','PACKAGE');