2

我需要同步一个 oracle 文本索引。但是作业无法创建:

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

或运行:

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

但如果我运行任何这些作品:

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

知道正确的语法吗?

谢谢你。

PD:我一直在寻找,但我找到的唯一答案不符合我的要求。我也为我的英语道歉。

4

1 回答 1

4

可以运行匿名块,PL/SQL中没有CALL,ALTER INDEX是DDL,需要在CTX_DDL中指定要运行哪个过程:

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

但是,我个人更喜欢将其封装在一个过程中(或者更好的是,一个包)并从作业中调用该过程:

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

另外,我很确定您实际上不需要重建索引 - 您只需要调用CTX_DDL.sync_index从表上的任何 DML 刷新它。

于 2010-10-06T11:49:48.977 回答