Oracle 無 SQL Server 的 IF EXISTS (...) DROP TABLE ... 簡潔語法。批次建立臨時表 (如 8 個 DB Link 並行採集) 時,手動確認極耗時。需自動化:存在即 Drop,不存在直接 Create,一次執行到位。
DECLARE
V_CNT INTEGER;
BEGIN
-- 1. 查詢 USER_TABLES 判斷是否存在
SELECT COUNT(*) INTO V_CNT
FROM USER_TABLES
WHERE TABLE_NAME = 'XB_TEST001'; -- 注意:大寫
-- 2. 存在則輸出訊息並 DROP
IF V_CNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('表已存在,執行 DROP...');
EXECUTE IMMEDIATE 'DROP TABLE XB_TEST001';
ELSE
DBMS_OUTPUT.PUT_LINE('表不存在,直接建立');
END IF;
-- 3. 重新建立表
EXECUTE IMMEDIATE 'CREATE TABLE XB_TEST001 (
ID INT PRIMARY KEY,
NAME VARCHAR2(50)
)';
DBMS_OUTPUT.PUT_LINE('建立完成');
END;
/
| 技術點 | 說明 |
|---|---|
USER_TABLES | 當前用戶擁有的表,效能優於 ALL_TABLES/DBA_TABLES |
TABLE_NAME 大寫 | Oracle 資料字典物件名預設大寫存儲,查詢條件必須大寫 |
EXECUTE IMMEDIATE | 執行動態 DDL (DROP/CREATE),PL/SQL 中不可直接寫 DDL |
| 匿名區塊 | 無需建立永久物件,腳本執行即可,適合部署腳本嵌入 |
CREATE OR REPLACE PROCEDURE RECREATE_TABLE (
P_TABLE_NAME IN VARCHAR2,
P_DDL IN CLOB
) AS
V_CNT INTEGER;
BEGIN
SELECT COUNT(*) INTO V_CNT FROM USER_TABLES WHERE TABLE_NAME = UPPER(P_TABLE_NAME);
IF V_CNT > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE ' || P_TABLE_NAME;
END IF;
EXECUTE IMMEDIATE P_DDL;
END;
/
-- 呼叫範例
BEGIN
RECREATE_TABLE('XB_TEST001', 'CREATE TABLE XB_TEST001 (ID INT PRIMARY KEY, NAME VARCHAR2(50))');
END;
/
透過 USER_TABLES + EXECUTE IMMEDIATE 實現 Oracle 版「IF EXISTS DROP THEN CREATE」,解決批次部署臨時表的互動確認痛點。封裝為 Procedure 後可進一步參數化 DDL,提升腳本復用性與維運效率。