Oracle texto programación de sincronización en solo índice
-
28-09-2019 - |
Pregunta
necesito para sincronizar un índice de texto oráculo. Pero el trabajo no puede crear:
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;
/
o para ejecutar:
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;
/
Pero si me quedo cualquiera de esas obras:
alter index NAME_IDX rebuild parameters ('sync');
call CTX_DDL('NAME_IDX');
Cualquier idea de la sintaxis correcta?
Gracias.
PD: He estado buscando, pero la única respuesta que encontré duerma satisfacer mis necesidades. También me disculpo por mi Inglés.
Solución
Puede ejecutar un bloque anónimo, llamada no está en PL / SQL, ALTER INDEX es DDL, y hay que especificar qué procedimiento en el CTX_DDL desea ejecutar:
WHAT => 'BEGIN EXECUTE IMMEDIATE ''alter index NAME_IDX rebuild parameters (''''sync'''')''; CTX_DDL.sync_index(''NAME_IDX''); END',
Sin embargo, personalmente prefiero a encapsular en un procedimiento (o, mejor aún, un paquete) y llamar al procedimiento desde el trabajo:
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;
/
Además, estoy bastante seguro de que en realidad no necesita reconstruir el índice -. Sólo tiene que CTX_DDL.sync_index
llamada para refrescar a él desde cualquier DML en la tabla