Question

Je dois synchroniser un index de texte oracle. Mais l'emploi ne parvient pas à créer:

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;
/

Ou à exécuter:

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;
/

Mais si je lance l'une de ces œuvres:

alter index NAME_IDX rebuild parameters ('sync');
call CTX_DDL('NAME_IDX');

Toute idée de la syntaxe correcte?

Merci.

PD: Ive été à la recherche, mais la seule réponse que je ne marche pas trouvé répondre à mes besoins. Je présente également mes excuses pour mon anglais.

Était-ce utile?

La solution

Vous pouvez exécuter un bloc anonyme, appel n'est pas en PL / SQL, ALTER INDEX est DDL, et vous devez spécifier la procédure CTX_DDL que vous souhaitez exécuter:

WHAT => 'BEGIN EXECUTE IMMEDIATE ''alter index NAME_IDX rebuild parameters (''''sync'''')''; CTX_DDL.sync_index(''NAME_IDX''); END',

Cependant, personnellement je préfère encapsuler dans une procédure (ou, mieux encore, un paquet) et appeler la procédure du travail:

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;
/

De plus, je suis sûr que vous n'avez pas réellement besoin de reconstruire l'index -. Vous ne devez appeler CTX_DDL.sync_index pour rafraîchir de toute DML sur la table

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top