Как выполнить процедуру с процедурой DBMS_SCHEDULER.CREATE_JOB

Я хочу создать задание, которое удаляло бы объект базы данных в заданную дату. Задание создано правильно, но процедура не выполняется. Пытался выполнить процедуру самостоятельно, и она работает.

Вот код для создания задания

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;

Я знаю, что это очень незначительная проблема. Заранее спасибо, гуру.

Ваше здоровье!


person Tunde    schedule 20.11.2009    source источник


Ответы (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');

Если это не решение, я настрою ваш код в базе данных и попробую сам.

person Philip Schlump    schedule 20.11.2009
comment
Большое спасибо, все работает. Между тем, вы действительно живете на парусной лодке? Спасибо, ты сделал мой день. Ваше здоровье! - person Tunde; 20.11.2009
comment
Да, я продал свою софтверную компанию 2 года назад. Мы побывали вверх и вниз по восточному побережью и до Багамских островов. Я живу со своей красивой женой и двумя замечательными детьми на 50-футовом паруснике. - person Philip Schlump; 20.11.2009
comment
Вы можете заглянуть в представление user_scheduler_jobs (или all_scheduler_jobs), чтобы убедиться, что данные вашего задания соответствуют вашим ожиданиям. - person Juergen Hartelt; 22.11.2009