【发布时间】:2020-11-28 11:20:05
【问题描述】:
我在查询下运行,给出错误。需要做什么才能得到请求的结果?
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 作为 select JOB_ID, last_update_time_utc, status from J_DOC where LAST_UPDATE_TIME_UTC
在过程运行数据出现在 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 点运行。 我们该怎么做?
【问题讨论】:
-
这个错误很容易解释,你不能创建一个具有特定名称的表,因为一个已经存在。也许您想使用不同的表名,或者您想插入现有表而不先创建它?一般认为,如果您将行插入(永久)全局临时表中,然后在最后将它们归档到常规表中,则这种事情看起来不需要任何动态 sql。
-
@BarbarosÖzhan 因为在程序运行之前表不(或不应该)存在,所以如果你不使用
EXECUTE IMMEDITATE,那么它会在编译时从非现有表。 -
这在第一次之后将不起作用,因为它引用了一个名为 TEMP_ID_STAT_TIME_FRM_JOB_DOC 的表,它在最后重命名为 TEMP_JOB_ID_FROM_JOB_DOC_1119。第二次运行它会失败,因为没有 TEMP_ID_STAT_TIME_FRM_JOB_DOC 表。
标签: sql oracle plsql oracle-sqldeveloper plsqldeveloper