Программирование заданий DBA в хранимых процессах - PullRequest
1 голос
/ 28 февраля 2011

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

Найдите ниже код моего сохраненного процесса, чтобы удалить таблицу и также создать задание DBA, которое будет выполняться ежечасно.

CREATE OR REPLACE procedure DELETE_My_TABLE(myschema varchar2) as 
BEGIN
    BEGIN
        execute immediate 'delete from '||myschema||'.mytable where clause;';
    END;
        BEGIN
            DBMS_SCHEDULER.create_program (
            program_name        => 'DELETE_My_TABLE',
            program_type        => 'STORED_PROCEDURE',
            program_action      => 'execute DELETE_My_TABLE(myschema)',
            number_of_arguments => 1,
            enabled             => FALSE,
            comments            => 'Program to delete table using a stored procedure.');
        DBMS_SCHEDULER.define_program_argument (
        program_name      => 'DELETE_My_TABLE',
        argument_name     => 'myschema',
        argument_position => 1,
        argument_type     => 'VARCHAR2',
        default_value     => 'myschema');

        DBMS_SCHEDULER.enable (name => 'DELETE_My_TABLE');
    END;

    BEGIN
        DBMS_SCHEDULER.create_schedule (
        schedule_name   => 'DELETE_My_TABLE',
        start_date      => SYSTIMESTAMP,
        repeat_interval => 'freq=hourly; byminute=0',
        end_date        => NULL,
        comments        => 'Hourly Job to purge SEARCH_TEMP_TABLE');
    END;
END;
/

Проблемы:

ERROR at line 1:
ORA-00920: invalid relational operator
ORA-06512: at "MYSCHEMA.DELETE_My_TABLE", line 4
ORA-06512: at line 1

Будет ли работать логика (и синтаксис)?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Для Oracle Scheduler вы обычно создаете программу один раз. Затем вы создаете работу, в которой программа является действием. Вы можете назначить для этой работы расписание, которое вы указали в своем коде, но вам придется выбирать. Либо вы создаете расписание и используете его для работы, либо вы даете работе свой собственный интервал повторения.

Я случайно узнал о книге ( Освоение планировщика Oracle ), которую я написал, которая может быть очень полезной.

2 голосов
/ 28 февраля 2011

Одна проблема, которую я вижу, заключается в том, что вам нужно извлечь точку с запятой из строки EXECUTE IMMEDIATE:

execute immediate 'delete from '||myschema||'.mytable where clause';
                                                                 ^^
                                                         Removed from here

думал, что я подозреваю, что это не решит вашу непосредственную проблему, которая выглядит так, как будто это ваши НАЧАЛО ... КОНЕЦ блоков.

...