Oracle PL/SQL在动态更改变量值时出现问题
我正在尝试使用Oracle中的动态查询概念更改查询中的表名 最初的执行情况良好。但一旦用新值修改了表名,即使它显示为旧值 检查下面的代码Oracle PL/SQL在动态更改变量值时出现问题,oracle,plsql,dynamic-sql,Oracle,Plsql,Dynamic Sql,我正在尝试使用Oracle中的动态查询概念更改查询中的表名 最初的执行情况良好。但一旦用新值修改了表名,即使它显示为旧值 检查下面的代码 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);
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\u备份表进行准备
请帮助我确定问题….重新分配变量DYNA\u QUERY\u 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;
重新分配变量DYNA\u QUERY\u 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;
除非使用For循环,否则动态查询将在程序中执行一次。若不想使用循环,可以使用相同的查询来执行第二次动态执行,这里我使用循环函数 代码
除非使用For循环,否则动态查询将在程序中执行一次。若不想使用循环,可以使用相同的查询来执行第二次动态执行,这里我使用循环函数 代码
是的,我也有同样的想法。但重新分配对我来说有些奇怪。我是Java开发人员,不熟悉PL/SQL程序。DYNA_表名的值已更改,因此需要再次分配DYNA_查询。不管怎样,你能告诉我第二次执行的结果是什么吗?它包含表名UserData\u Backup,对吗?是的,获得了第二个表名:-是的,我也有同样的想法。但重新分配对我来说有些奇怪。我是Java开发人员,不熟悉PL/SQL程序。DYNA_表名的值已更改,因此需要再次分配DYNA_查询。不管怎样,你能告诉我第二次执行的结果是什么吗?它包含表名UserData\u Backup,对吗?是的,获得了第二个表名:-希望我的解决方案能对你有所帮助。。检查一下。!!您并没有更改表名,它已经硬编码到DYNA_QUERY_DEL中。您只更改了不再使用的变量的值。使用动态SQL有什么具体的原因吗?希望我的解决方案能对您有所帮助。。检查一下。!!您并没有更改表名,它已经硬编码到DYNA_QUERY_DEL中。您只更改了不再使用的变量的值。使用动态SQL有什么具体的原因吗?是的,重新分配相同的查询是有效的。但是我们有没有其他方法,比如刷新缓存或DYNA_TABLE_NAME变量的会话。。。我在代码中更新的备用循环方法检查它。这对你有帮助吗?是的,只是寻找备用方法。是的,重新分配相同的查询是有效的。但是我们有没有其他方法,比如刷新缓存或DYNA_TABLE_NAME变量的会话。。。我在我的代码中更新了备用循环方法。检查一下。这对你有帮助吗?是的,只是看看备用方法。