Pergunta

Eu preciso sincronizar um Índice de texto do Oracle. Mas Jó não consegue criar:

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 para executar:

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

Mas se eu executar algum desses trabalhos:

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

Alguma ideia da sintaxe correta?

Obrigada.

PD: Estive pesquisando, mas a única resposta que encontrei não atende aos meus requisitos. Eu também peço desculpas pelo meu inglês.

Foi útil?

Solução

Você pode executar um bloco anônimo, a chamada não está no PL/SQL, o Alter Index é DDL e você precisa especificar qual procedimento em ctx_ddl você deseja executar:

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

No entanto, pessoalmente, prefiro encapsulá -lo em um procedimento (ou, melhor ainda, um pacote) e chamar o procedimento do trabalho:

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

Além disso, tenho certeza de que você realmente não precisa reconstruir o índice - você só precisa ligar CTX_DDL.sync_index Para atualizá -lo de qualquer DML sobre a mesa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top