2010-10-06 2 views
2

Мне нужно синхронизировать индекс текста оракула. Но работа не создает:Синхронизация графического планирования Oracle по одному индексу

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: Я искал, но единственный ответ, который я нашел, не соответствует моим требованиям. Я также извиняюсь за свой английский.

ответ

4

Вы можете запустить анонимный блок, вызов не в 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 на столе.

+0

Спасибо. Это то, что сработало для меня: WHAT => «BEGIN EXECUTE IMMEDIATE» изменить параметры NAME_IDX rebuild ('' '' sync '' '') ''; END; ', – ssedano

+0

Другой вопрос, а также CTX_DDL.OPTIMIZE_INDEX (' INDEX_NAME ',' FULL ', 45); в течение 45 минут. Что бы это было? Ты! – ssedano

+1

'what => 'CTX_DDL.OPTIMIZE_INDEX (' 'INDEX_NAME' ',' 'FULL' ', 45);' –