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

Oracle 判斷表是否存在的 SQL 寫法

     編輯:Oracle 資料庫基礎

標準寫法


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');
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved