我試圖在Oracle中使用動態查詢概念在查詢中更改表名。Oracle PL/SQL動態更改變量值
初始執行情況良好。但是,一旦表名稱修改爲新值,即使它顯示爲舊值。
檢查下面的代碼....
CREATE OR REPLACE PROCEDURE Test
AS
BEGIN
DECLARE
DELETE_OLD_YEARS NUMBER(2);
RECORD_COUNT NUMBER(10);
INTERVAL_UNIT VARCHAR2(4);
DYNA_QUERY_DEL VARCHAR2(280);
DYNA_TABLE_NAME VARCHAR(30);
BEGIN
INTERVAL_UNIT := 'YEAR';
RECORD_COUNT := 0;
DYNA_TABLE_NAME := 'UserData';
DELETE_OLD_YEARS := 7;
DYNA_QUERY_DEL := 'SELECT COUNT(*)
FROM ' || DYNA_TABLE_NAME || ' UD
WHERE UD.LOGIN_DT < (SYSDATE - NUMTOYMINTERVAL(:1, :2))
OR UD.LOGIN_DT IS NULL ORDER BY UD.LOGIN_DT DESC';
-- Delete older than 7 years data
DBMS_OUTPUT.PUT_LINE('Dynamic Query with UserData: ' || DYNA_QUERY_DEL);
EXECUTE IMMEDIATE DYNA_QUERY_DEL INTO RECORD_COUNT USING DELETE_OLD_YEARS, INTERVAL_UNIT;
DBMS_OUTPUT.PUT_LINE('Record Count : ' || RECORD_COUNT);
-- Delete older than 7 years data from backup table.
DYNA_TABLE_NAME := 'UserData_Backup';
DELETE_OLD_YEARS := 7;
DBMS_OUTPUT.PUT_LINE('Dynamic Query with UserData_Backup : ' || DYNA_QUERY_DEL);
EXECUTE IMMEDIATE DYNA_QUERY_DEL INTO RECORD_COUNT USING DELETE_OLD_YEARS, INTERVAL_UNIT;
DBMS_OUTPUT.PUT_LINE('Record Count 2 : ' || RECORD_COUNT);
END;
END;
/
exec Test;
,輸出是....
Dynamic Query with UserData : SELECT COUNT(*)
FROM UserData UD
WHERE UD.LOGIN_DT < (SYSDATE - NUMTOYMINTERVAL(:1, :2))
OR UD.LOGIN_DT IS NULL ORDER BY UD.LOGIN_DT DESC
Record Count : 6220
Dynamic Query with UserData_Backup : SELECT COUNT(*)
FROM UserData UD
WHERE UD.LOGIN_DT < (SYSDATE - NUMTOYMINTERVAL(:1, :2))
OR UD.LOGIN_DT IS NULL ORDER BY UD.LOGIN_DT DESC
Record Count 2 : 6220
但這裏的第二個查詢應與UserData_Backup表準備。
請幫我找出這個問題....
希望我的解決方案將幫助你..檢查。! –
您沒有更改表名,它已經被硬編碼到DYNA_QUERY_DEL中。您只更改了未再使用的變量的值。使用動態SQL有什麼特別的原因嗎? –