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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top