Синхронизация планирования текста Oracle по одному индексу - PullRequest
2 голосов
/ 06 октября 2010

Мне нужно синхронизировать индекс текста оракула.Но задание не может создать:

declare
    v_job_id number(19,0);
begin
dbms_job.submit(
    JOB        => v_job_id,
    WHAT        => 'alter index NAME_IDX rebuild parameters (''sync'');',
    NEXT_DATE => SYSDATE + (1/24),
    INTERVAL    => 'SYSDATE + (1/24) + 7'
    );
end;
/

Или выполнить:

declare
    v_job_id number(19,0);
begin
dbms_job.submit(
    JOB        => v_job_id,
    WHAT        => 'CTX_DDL(''NAME_IDX'');',
    NEXT_DATE => SYSDATE + (1/24),
    INTERVAL    => 'SYSDATE + (1/24) + 7'
    );
end;
/

Но если я запусту любую из этих работ:

alter index NAME_IDX rebuild parameters ('sync');
call CTX_DDL('NAME_IDX');

Любое представление оправильный синтаксис?

Спасибо.

PD: Я искал, но единственный найденный ответ не соответствует моим требованиям.Я также прошу прощения за мой английский.

1 Ответ

4 голосов
/ 06 октября 2010

Вы можете запустить анонимный блок, CALL отсутствует в PL / SQL, ALTER INDEX равен DDL, и вам нужно указать, какую процедуру в CTX_DDL вы хотите запустить:

WHAT => 'BEGIN EXECUTE IMMEDIATE ''alter index NAME_IDX rebuild parameters (''''sync'''')''; CTX_DDL.sync_index(''NAME_IDX''); END',

Однако лично я предпочитаю инкапсулировать его в процедуру (или, что еще лучше, в пакет) и вызывать процедуру из работы:

CREATE PROCEDURE rebuild_name_idx IS
BEGIN
    EXECUTE IMMEDIATE 'alter index NAME_IDX rebuild parameters (''sync'')';
    CTX_DDL.sync_index('NAME_IDX');
END;
/

declare
    v_job_id number(19,0);
begin
  dbms_job.submit(
    JOB       => v_job_id,
    WHAT      => 'rebuild_name_idx;',
    NEXT_DATE => SYSDATE + (1/24),
    INTERVAL  => 'SYSDATE + (1/24) + 7'
    );
end;
/

Кроме того, я почти уверен, что вам на самом деле не нужно перестраивать индекс - вам нужно всего лишь вызвать CTX_DDL.sync_index, чтобы обновить его из любого DML на столе.

...