سؤال

أحتاج إلى مزامنة فهرس النص 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: لقد كنت أبحث ، لكن الإجابة الوحيدة التي وجدتها لا تتناسب مع متطلباتي. أنا أيضا أعتذر عن لغتي الإنجليزية.

هل كانت مفيدة؟

المحلول

يمكنك تشغيل كتلة مجهولة المصدر ، والاتصال ليس في PL/SQL ، فهرس Alter هو 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 على الجدول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top