2017-10-10 83 views
0

我試圖在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表準備。

請幫我找出這個問題....

+0

希望我的解決方案將幫助你..檢查。! –

+0

您沒有更改表名,它已經被硬編碼到DYNA_QUERY_DEL中。您只更改了未再使用的變量的值。使用動態SQL有什麼特別的原因嗎? –

回答

1

動態查詢將起到一個時間的計劃,除非你是使用For循環。如果你不想使用循環,你可以使用相同的查詢來第二次動態執行,在這裏我使用循環函數。

代碼

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'; 
      -- DYNA_TABLE_NAME := 'UserData_Backup'; 
      DELETE_OLD_YEARS := 7; 
      for c1 in (select 'UserData' as DYNA_TABLE_NAME from dual 
         union all 
         select 'UserData_Backup' as DYNA_TABLE_NAME from dual) 
      loop 
      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; 
      RECORD_COUNT := RECORD_COUNT +1; 
      end loop; 
      DBMS_OUTPUT.PUT_LINE('Record Count 2 : ' || RECORD_COUNT); 
      END; 
     END; 
     /
     exec Test; 
+0

是的,重新分配相同的查詢正在工作。但是,我們是否有其他方法來刷新緩存或DYNA_TABLE_NAME變量的會話? – srihariraom

+0

耶...備用循環方法我已經在我的代碼更新檢查它。 –

+0

對您有幫助嗎? –

1

重新分配變量DYNA_QUERY_DEL嘗試做這樣的

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'; 

    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_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; 
+0

是的,我也有同樣的想法。但重新分配看起來有點奇怪。我是Java開發人員,也是PL/SQL程序的新成員。 – srihariraom

+0

'DYNA_TABLE_NAME'的值改變了,這就是爲什麼你需要再次分配'DYNA_QUERY_DEL'。無論如何,你能告訴我第二次執行的輸出是什麼嗎?它包含表名'UserData_Backup'吧? – Moudiz

+0

是的,得到了​​第二個表名。 :-) – srihariraom