题
我需要同步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 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刷新它。
不隶属于 StackOverflow