代码之家  ›  专栏  ›  技术社区  ›  ssedano

单索引上的Oracle文本调度同步

  •  2
  • ssedano  · 技术社区  · 15 年前

    我需要同步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');
    

    知道正确的语法吗?

    谢谢您。

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

    1 回复  |  直到 13 年前
        1
  •  4
  •   Jeffrey Kemp    15 年前

    可以运行匿名块,调用不在PL/SQL中,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刷新它。

    推荐文章