Plsql 如何在oracle中使用每日计划的作业调用存储过程?

Plsql 如何在oracle中使用每日计划的作业调用存储过程?,plsql,oracle11g,job-scheduling,Plsql,Oracle11g,Job Scheduling,我不熟悉oracle工作脚本。我写了一些清除程序来清除所有旧数据并保留过去3个月的数据。。。程序已成功执行。它的工作时,我呼吁手动也。程序如下: CREATE OR REPLACE PROCEDURE Archive IS v_query varchar2(2048); v_tablename VARCHAR2(50); v_condition varchar2(50); TYPE cur_typ IS REF CURSOR;

我不熟悉oracle工作脚本。我写了一些清除程序来清除所有旧数据并保留过去3个月的数据。。。程序已成功执行。它的工作时,我呼吁手动也。程序如下:

CREATE OR REPLACE PROCEDURE Archive 
IS

       v_query varchar2(2048);
       v_tablename VARCHAR2(50);
       v_condition varchar2(50);
       TYPE cur_typ IS REF CURSOR;
       c cur_typ;
BEGIN 
    OPEN c for 'select tablename,columnname from pseb.purge_tables';
        FETCH c INTO v_tablename,v_condition;
        LOOP
           EXIT WHEN c%NOTFOUND;
           if(v_tablename ='cfw.DCTBLPERFCUMULATIVEMASTER') then
               v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB3MAINREG where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
               v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB4TODENERG where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
               v_query:='delete from cfw.DCTBLPERDFCUMULATIVEB5MAXDEMAN where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
               v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB6TODREG where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
               v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB7MAXDEMAN where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
               v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB8MAXDEMAN where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
               v_query:='delete FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
           else
           begin
               v_query:='delete FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
               execute immediate v_query;
           end;
           end if;
       FETCH c INTO v_tablename,v_condition;
        end LOOP;
        close c;
END; --Procedure
begin
  DBMS_SCHEDULER.CREATE_JOB (
     job_name           =>  'purgeproc_automation',
     job_type           =>  'STORED_PROCEDURE',
     job_action         =>  'call pseb.archive();',
     repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */
     auto_drop          => false,
     enabled            => true,
   comments           =>  'My new job');
end;
/
已成功创建作业,但作业状态为“失败”,而不是“成功”。这背后的原因是什么?它返回以下错误:

ORA-06550: line 1, column 728:
PLS-00103: Encountered the symbol "PSEB" when expecting one of the following:

   := . ( @ % ;
The symbol ":=" was substituted for "PSEB" to continue.

请指导我解决这个问题…

您似乎将使用创建作业的两种不同方法与创建程序混合使用。请将脚本更改为以下内容:

begin
  DBMS_SCHEDULER.CREATE_JOB (
     job_name           =>  'purgeproc_automation',
     job_type           =>  'PLSQL_BLOCK',
     job_action         =>  'BEGIN call pseb.archive(); END;',
     repeat_interval    =>  'FREQ=DAILY;INTERVAL=2', /* every other day */
     auto_drop          => false,
     enabled            => true,
   comments           =>  'My new job');
end;
/

天哪,你的代码看起来太复杂了。首先考虑这个简化:

CREATE OR REPLACE PROCEDURE Archive 
IS
   v_query varchar2(2048);
BEGIN 
    FOR REC IN (select tablename,columnname condition from pseb.purge_tables)
    LOOP
       if(rec.tablename ='cfw.DCTBLPERFCUMULATIVEMASTER') then
           v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB3MAINREG where cumulativeid in (select cumulativeid FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
           v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB4TODENERG where cumulativeid in (select cumulativeid FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
           v_query:='delete from cfw.DCTBLPERDFCUMULATIVEB5MAXDEMAN where cumulativeid in (select cumulativeid FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
           v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB6TODREG where cumulativeid in (select cumulativeid FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
           v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB7MAXDEMAN where cumulativeid in (select cumulativeid FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
           v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB8MAXDEMAN where cumulativeid in (select cumulativeid FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
           v_query:='delete FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
       else
           v_query:='delete FROM '|| rec.tablename || ' WHERE ' || rec.condition||' < sysdate-90';
           execute immediate v_query;
       end if;
    END LOOP;
END; --Procedure

从调度程序作业执行存储过程的最简单方法是更改
作业类型

你可以使用你自己的价值观。尝试此操作并返回结果

例如:

job_type             => 'STORED_PROCEDURE',

job_action           => '"OWNER"."PROCEDURE_NAME"',

然后,调度程序似乎无法访问您的包。那么我如何才能完成该任务?您需要找出调度程序运行作业的用户。假设您的包位于另一个架构中,您必须确保调度器用户可以访问创建包的架构。很抱歉,但当我无法访问您的环境时,要说得更具体一点有点困难。根据您的指导,我检查了用户计划程序正在运行。在Pseb模式本身中,一个示例作业正在运行。我在同一用户中创建了另一个作业,用于执行相同的过程,并给出相同的错误:(嗨,嗯,谢谢你的简化。我用你的示例代码创建了这份工作(使用提交)。如何查看已提交作业的详细信息?或者如何验证作业状态是否失败或成功?mmm我创建了作业,它返回成功执行的pl/sql过程。但在user_jobs表中,没有详细信息1.您提交了吗?2.您在哪个用户上运行了pl/sql?3.您有权访问dba用户吗?如果是,请尝试所有的\u作业查看。哦,太好了,嗯,谢谢你的指导。我当时没有提交,现在已经完成了:)它运行没有任何失败吗?您可能需要对它进行一点调整—间隔“sysdate+2”意味着它将在作业结束时增加2天(因此运行时间将不断向前移动)。更好的定义是通过给_date(2012-12-01 12:00:00,'YYYY-MM-DD HH24:MI:SS')+2'指定正确的日期来定义时间,这样您就可以确保下一个运行日期是您指定的日期。
select * from user_jobs;
job_type             => 'STORED_PROCEDURE',

job_action           => '"OWNER"."PROCEDURE_NAME"',