我正在查询下面运行,给出错误。需要做些什么才能获得要求的结果?
create or replace PROCEDURE data_cleanup_29th_nov_2020
IS
BEGIN
EXECUTE IMMEDIATE 'create table TEMP_ID_STAT_TIME_FRM_JOB_DOC as select JOB_ID, last_update_time_utc, status from J_DOC where
LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 30 and status=''Sent''';
execute immediate 'delete from HUB_SIG where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
execute immediate 'delete from J_DOC
where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
EXECUTE IMMEDIATE 'RENAME TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC TO TEMP_JOB_ID_FROM_JOB_DOC_1119';
END;
commit;
运行程序后出现以下错误
BEGIN
data_cleanup_29th_nov_2020();
--rollback;
END;
ORA-00955:名称已被现有对象使用ORA-06512:在“ HUB.DATA_CLEANUP_29TH_NOV_2020”第7行中ORA-06512:在第2 00955行。00000-“名称已被现有对象使用
尝试以下查询:
CREATE OR REPLACE PROCEDURE ATAS_CLEANUP_NOV_2020 IS
BEGIN
EXECUTE IMMEDIATE 'create table TEMP_ID_STAT_TIME_FRM_JOB_DOC as select JOB_ID, last_update_time_utc, status from J_DOC where
LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 30 and status=''Sent''';
EXECUTE IMMEDIATE 'delete from HUB_SIGNATURE_DETAILS where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
EXECUTE IMMEDIATE 'delete from J_DOC
where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
--EXECUTE IMMEDIATE 'RENAME TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC TO TEMP_JOB_ID_FROM_JOB_DOC_1119';
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE TEMP_JOB_ID_FROM_JOB_DOC_1119';
EXCEPTION
WHEN OTHER THEN
NULL;
END;
EXECUTE IMMEDIATE 'ALTER TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC RENAME TO TEMP_JOB_ID_FROM_JOB_DOC_1119';
END;
出现以下错误:
错误(14,5):PL / SQL:语句被忽略错误(17,14):PLS-00201:必须声明标识符“ OTHER”
尝试过此方法并成功运行:
CREATE OR REPLACE PROCEDURE ATAS_LATEST_DATA_cleanup_nov IS
BEGIN
EXECUTE IMMEDIATE 'delete from HUB_SIG where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
EXECUTE IMMEDIATE 'delete from J_DOC
where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
--EXECUTE IMMEDIATE 'RENAME TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC TO TEMP_JOB_ID_FROM_JOB_DOC_1119';
--BEGIN
-- EXECUTE IMMEDIATE 'DROP TABLE TEMP_JOB_ID_FROM_JOB_DOC_1119';
--EXCEPTION
-- WHEN OTHER THEN
-- NULL;
-- END;
EXECUTE IMMEDIATE 'ALTER TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC RENAME TO TEMP_JOB_ID_FROM_JOB_DOC_1119';
END;
COMMIT;
BEGIN
ATAS_LATEST_DATA_cleanup_nov();
--rollback;
END;
匿名屏蔽已完成
在过程外部创建了临时表。创建表TEMP_JOB_ID_FROM_JOB_DOC_1119作为选择JOB_ID,last_update_time_utc,来自J_DOC的状态,其中LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE)-30并且状态=“已发送”
在TEMP_JOB_ID_FROM_JOB_DOC_1119中存在程序运行数据之后,并使用了现在程序内部的临时表
现在,我们必须实现获取日期作为输入,并在重命名表时传递日期(RENAME TEMP_ID_STAT_TIME_FRM_JOB_DOC TO TEMP_JOB_ID_FROM_JOB_DOC_1119)
并将此过程安排在DBMS_SCHEDULER中,以使其在美国太平洋标准时间晚上10点运行。我们应该怎么做?
你的rename table
命令是错误的。
它应该是:
ALTER TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC RENAME TO TEMP_JOB_ID_FROM_JOB_DOC_1119;
同样,你可以执行一次该过程,如果再次执行该过程,则它将在重命名命令上引发错误。
现在,查看数据库中是否已有可用的表。如果是,则将其删除,然后再次调用以下过程。
因此,请尝试以下代码:
CREATE OR REPLACE PROCEDURE DATA_CLEANUP_29TH_NOV_2020
(P_IN_DATE IN DATE)
IS
BEGIN
EXECUTE IMMEDIATE 'create table TEMP_ID_STAT_TIME_FRM_JOB_DOC as select JOB_ID, last_update_time_utc, status from J_DOC where
LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 30 and status=''Sent''';
EXECUTE IMMEDIATE 'delete from HUB_SIG where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
EXECUTE IMMEDIATE 'delete from J_DOC
where JOB_id IN ( SELECT JOB_ID
FROM TEMP_ID_STAT_TIME_FRM_JOB_DOC)';
--EXECUTE IMMEDIATE 'RENAME TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC TO TEMP_JOB_ID_FROM_JOB_DOC_1119';
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE TEMP_JOB_ID_FROM_JOB_DOC_1119';
EXCEPTION
WHEN OTHER THEN
NULL;
END;
EXECUTE IMMEDIATE 'ALTER TABLE TEMP_ID_STAT_TIME_FRM_JOB_DOC RENAME TO TEMP_JOB_ID_FROM_JOB_DOC_' || TO_CHAR(P_IN_DATE, 'MMYY');
END;
/
避免动态查询始终是一个好习惯。
你可以在此过程之外创建一个表,并将其用于存储临时数据。或者,你可以使用全局临时表。
我们需要在过程中使它们自动化。我们必须获取日期作为输入,并在重命名表时将其传递(RENAME TEMP_ID_STAT_TIME_FRM_JOB_DOC TO TEMP_JOB_ID_FROM_JOB_DOC_1119),并在DBMS_SCHEDULER中安排此过程
您也可以使用
rename t1 to t2;
(尽管不像rename table t1 to t2
OP最初尝试的那样)。when others
缺少一个s
。我现在已经执行了该过程,现在我们需要日期作为输入,并在重命名表时将其传递(RENAME TEMP_ID_STAT_TIME_FRM_JOB_DOC TO TEMP_JOB_ID_FROM_JOB_DOC_1119)并在DBMS_SCHEDULER中安排此过程
“我们必须获取日期作为输入,并在重命名表时传递该日期”,然后我建议您的数据模型从根本上来说是有缺陷的。日期从本质上来说是业务数据的一部分,不应将其合并到对象的名称中(表或过程名称)。