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
しかし、ここでは2番目のクエリは、UserData_Backupテーブルで準備する必要があります。
親切
は、私の解決策は、あなたが...それをチェックするのに役立ちます願っています。! –
テーブル名は変更されていません。すでにDYNA_QUERY_DELにハードコードされています。再度使用されない変数の値のみを変更しました。動的SQLを使用する特別な理由はありますか? –