Синхронизация планирования текста 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: Я искал, но единственный ответ, который я нашел, не соответствует моим требованиям. Я также прошу прощения за мой английский.
1 ответ
Решение
Вы можете запустить анонимный блок, 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 на столе.