首页 > 解决方案 > 注册:程序出错

问题描述

以下是我的程序给出的错误,请检查并确认。

create or replace PROCEDURE CLEANUP_rec

IS

BEGIN

EXECUTE IMMEDIATE 'create table TEMP_JOB_ID_FROM_JOB_DOC_1119 as select JOB_ID, last_update_time_utc, status from J_DOC where 
LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 90 and status=''Sent''';

delete from HUB_SIG where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_JOB_ID_FROM_JOB_DOC_1119);

  delete from J_DOC 
 where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_JOB_ID_FROM_JOB_DOC_1119);



EXECUTE IMMEDIATE 'RENAME TABLE TEMP_JOB_ID_FROM_JOB_DOC_1119 TO TEMP_ID_STAT_TIME_FRM_JOB_DOC';



END;

给出以下错误

Project: C:\Users\bc8807\AppData\Roaming\SQL Developer\system4.0.1.14.48\o.sqldeveloper.12.2.0.14.48\projects\IdeConnections#database_zltv9883.jpr
t1c3d231_db_connection
Error(10,1): PL/SQL: SQL Statement ignored
Error(11,8): PL/SQL: ORA-00942: table or view does not exist
Error(13,3): PL/SQL: SQL Statement ignored
Error(15,8): PL/SQL: ORA-00942: table or view does not exist

请建议我们如何解决这个问题。

所以请确认以下是正确的:

create or replace PROCEDURE CLEANUP_AUTOMATION

IS

BEGIN

EXECUTE IMMEDIATE 'create table TEMP_JOB_ID_FROM_JOB_DOC_1119 as select JOB_ID, last_update_time_utc, status from J_DOC where 
LAST_UPDATE_TIME_UTC <= TRUNC(SYSDATE) - 90 and status=''Sent''';

  execute immediate 'delete from HUB_SIG where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_JOB_ID_FROM_JOB_DOC_1119)';


 execute immediate 'delete from J_DOC
 where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_JOB_ID_FROM_JOB_DOC_1119)';

EXECUTE IMMEDIATE 'RENAME TABLE TEMP_JOB_ID_FROM_JOB_DOC_1119 TO TEMP_ID_STAT_TIME_FRM_JOB_DOC';



END;

下一步将是在程序内部使它们自动化。我们必须获取日期作为输入并在重命名表时传递它(RENAME TEMP_JOB_ID_FROM_JOB_DOC_1119 TO TEMP_ID_STAT_TIME_FRM_JOB_DOC)

并在 DBMS_SCHEDULER 中安排此过程在每晚太平洋标准时间晚上 10 点运行。

请建议

标签: sqloracleplsqlplsqldeveloperplsql-package

解决方案


这里的问题是您正在尝试编译一个过程,从而检查所有代码是否正确,它使用了一个在编译时不存在的表。

无论execute immediate字符串中有什么,都不能编写使用不存在的东西的语句。

如果你严格需要在运行时创建这个表,使用它然后重命名它,你需要对所有使用你的表的语句使用动态 SQL:

execute immediate 'delete from HUB_SIG where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_JOB_ID_FROM_JOB_DOC_1119)';

 execute immediate 'delete from J_DOC 
 where JOB_id IN ( SELECT JOB_ID
  FROM TEMP_JOB_ID_FROM_JOB_DOC_1119)';

推荐阅读