Oracle scheduling testo sincronizzazione sull'indice singolo
-
28-09-2019 - |
Domanda
Ho bisogno di sincronizzare un indice di testo oracolo. Ma lavoro non riesce a creare:
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 per eseguire:
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;
/
Ma se corro una di queste opere:
alter index NAME_IDX rebuild parameters ('sync');
call CTX_DDL('NAME_IDX');
Qualche idea della sintassi corretta?
Grazie.
PD: Ive cercato, ma l'unica risposta che ho trovato pretende molto adatta alle mie esigenze. Mi scuso anche per il mio inglese.
Soluzione
È possibile eseguire un blocco anonimo, chiamata non è in PL / SQL, ALTER INDEX è DDL, ed è necessario specificare quale procedura CTX_DDL si desidera eseguire:
WHAT => 'BEGIN EXECUTE IMMEDIATE ''alter index NAME_IDX rebuild parameters (''''sync'''')''; CTX_DDL.sync_index(''NAME_IDX''); END',
Tuttavia, personalmente preferisco incapsulare in una procedura (o, meglio ancora, un pacchetto) e chiamare la procedura dal lavoro:
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;
/
Inoltre, sono abbastanza sicuro che in realtà non c'è bisogno di ricostruire l'indice -. Avete solo bisogno di chiamata CTX_DDL.sync_index
per aggiornare da qualsiasi DML sulla tabella