Warm tip: This article is reproduced from serverfault.com, please click

sql-程序未运行

(sql - Procedure is not running)

发布于 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作为选择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点运行。我们应该怎么做?

Questioner
singh_dba
Viewed
0
Popeye 2020-11-29 09:20:08

你的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;
/

避免动态查询始终是一个好习惯。

你可以在此过程之外创建一个表,并将其用于存储临时数据。或者,你可以使用全局临时表。