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

Oracle 預存程序中使用動態 SQL 執行動態表名

     編輯:Oracle 資料庫基礎

問題情境

欲動態產生表名 RING_ALL_OLD_200606 和 RING_ALL_OLD_200606_TMP 並用於 INSERT INTO ... SELECT,直接用變數作表名會編譯錯誤。

錯誤寫法

CREATE OR REPLACE PROCEDURE SYSRINGALL_TEST IS
  ALL_TMP_NAME CHAR(30);
  ALL_NAME CHAR(30);
BEGIN
  -- 指定動態表名
  INSERT INTO ALL_TMP_NAME SELECT * FROM ALL_NAME;  -- 編譯失敗
  COMMIT;
END;

正確寫法:EXECUTE IMMEDIATE

CREATE OR REPLACE PROCEDURE SYSRINGALL_TEST IS
  ALL_TMP_NAME CHAR(30);
  ALL_NAME CHAR(30);
  TMP_STR VARCHAR2(2000);
BEGIN
  IF ALL_TMP_NAME IS NULL THEN
    SELECT 'RING_INKFISH_'||TO_CHAR(SYSDATE,'YYYYMM')||'_TMP'
      INTO ALL_TMP_NAME FROM DUAL;
  END IF;
  IF ALL_NAME IS NULL THEN
    SELECT 'RING_INKFISH_'||TO_CHAR(SYSDATE,'YYYYMM')
      INTO ALL_NAME FROM DUAL;
  END IF;
  TMP_STR := 'INSERT INTO '||ALL_TMP_NAME||' SELECT * FROM '||ALL_NAME;
  EXECUTE IMMEDIATE TMP_STR;
  COMMIT;
END SYSRINGALL_TEST;

關鍵點

  • 動態表名、欄位名、SQL 結構必須用 EXECUTE IMMEDIATE 執行動態 SQL。
  • 先組裝完整 SQL 字串,再呼叫 EXECUTE IMMEDIATE。
  • 若有綁定變數,可用 USING 子句。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved