【问题标题】:How to execute a procedure with DBMS_SCHEDULER.CREATE_JOB procedure如何使用 DBMS_SCHEDULER.CREATE_JOB 过程执行过程
【发布时间】:2010-12-18 16:48:48
【问题描述】:

我想创建一个在给定日期删除数据库对象的作业。作业创建正常,但未执行该过程。尝试单独执行该过程,它可以工作。

这是创建作业的代码

v_jobnam := v_objnam; 
                v_jobnam := DBMS_SCHEDULER.generate_job_name (v_jobnam);  

 v_startdate := to_timestamp(v_startdate); 
     select sysdate + (v_delhrs/1440) 
        into v_startdate
        from dual;

 DBMS_SCHEDULER.CREATE_JOB(job_name => v_jobnam, job_type => 'PLSQL_BLOCK', JOB_ACTION => 'BEGIN DROP_OBJ1(' || v_objnam|| ', ' || v_objtyp || ', '|| v_schema || ',' || v_objid ||'); END;', start_date => SYSTIMESTAMP, repeat_interval => 'freq=secondly; bysecond=0', end_date => NULL, enabled => TRUE, comments => 'Calls PLSQL once');

其中 v_delhrs 是一个数字。 这是该过程的代码:

  PROCEDURE DROP_OBJ1
    (
        p_objnam       IN   CHAR,
        p_objtyp       IN   CHAR,
        p_copyto       IN   ALL_OBJECTS.OWNER%TYPE,
        p_objid        IN   NUMBER
    )
    IS

       v_objnam       VARCHAR2 (30);
       v_objtyp       VARCHAR2 (30);
       v_copyto       VARCHAR2 (30);
       v_objid        NUMBER (3);


    BEGIN

            v_objnam := UPPER (p_objnam);
            v_objtyp := UPPER (p_objtyp);
            v_copyto := UPPER (p_copyto);
            v_objid  := p_objid;
            --v_copyby := UPPER (p_copyby);

             EXECUTE IMMEDIATE ( ' DROP '
                               || v_objtyp
                               || ' '
                               || v_copyto
                               || '.'
                               || v_objnam
                               );

             EXECUTE IMMEDIATE ( ' DELETE FROM COPY_OBJ_DET WHERE OBJ_ID = '
                                || v_objid
                                );


         COMMIT;

    END;

我知道这是一个非常小的问题。 在此先感谢各位大师。

干杯!

【问题讨论】:

    标签: oracle oracle10g dbms-scheduler


    【解决方案1】:

    在我看来,您在 DBMS_JOBS 设置调用中遗漏了一些引号。

    试试这个:

    DBMS_SCHEDULER.CREATE_JOB(job_name        => v_jobnam,
                              job_type        => 'PLSQL_BLOCK',
                              JOB_ACTION      => 'BEGIN DROP_OBJ1(''' || v_objnam 
                                                 || ''', ''' || v_objtyp || ''', '''
                                                 || v_schema || ''',' || v_objid 
                                                 || '); END;',
                              start_date      => SYSTIMESTAMP,
                              repeat_interval => 'freq=secondly; bysecond=0',
                              end_date        => NULL,
                              enabled         => TRUE,
                              comments        => 'Calls PLSQL once');
    

    如果这不是解决方案,我将在数据库上设置您的代码并自己尝试。

    【讨论】:

    • 非常感谢,它有效。在这两者之间,你真的住在帆船上吗?谢谢,你让我开心。干杯!
    • 是的 - 我在 2 年前卖掉了我的软件公司。我们一直在东成本和巴哈马上下起伏。我和我美丽的妻子和 2 个很棒的孩子住在一艘 50 英尺的帆船上。
    • 您可以查看 user_scheduler_jobs 视图(或 all_scheduler_jobs)以验证您的作业数据是否符合您的预期
    猜你喜欢
    • 2015-06-15
    • 2019-08-12
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2020-08-18
    相关资源
    最近更新 更多