欲動態產生表名 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;
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;
EXECUTE IMMEDIATE 執行動態 SQL。EXECUTE IMMEDIATE。USING 子句。