Небольшая настройка может помочь.
Вот что не работает:
SQL> create table interventi
2 (dataora timestamp(6) primary key,
3 parlamentare varchar2(16),
4 testo clob);
Table created.
SQL> create index idx_testo_interventi on interventi (testo)
2 indextype is ctxsys.context;
create index idx_testo_interventi on interventi (testo)
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10528: primary keys of type TIMESTAMP(6) are not allowed
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366
И вот что вы можете сделать:
- включить дополнительный столбец(Идентификатор в моем примере), который будет использоваться в качестве первичного ключа
- , заполняйте его триггером, используя столбец последовательности
- , который вы использовали в качестве первичного ключа до тех пор, пока для него не установлено значение уникальный не нуль (который будет действовать как первичный ключ - без дубликатов, без значений NULL)
.
SQL> drop table interventi;
Table dropped.
SQL> create table interventi
2 (id number primary key,
3 dataora timestamp(6) unique not null,
4 parlamentare varchar2(16),
5 testo clob);
Table created.
SQL> create sequence seqa;
Sequence created.
SQL> create or replace trigger trg_bi_inter
2 before insert on interventi
3 for each row
4 begin
5 :new.id := seqa.nextval;
6 end;
7 /
Trigger created.
SQL> create index idx_testo_interventi on interventi (testo)
2 indextype is ctxsys.context;
Index created.
SQL>
[ПРАВИТЬ:как запустить CTX_DDL]
Вам нужно будет приобрести привилегии для его запуска.Вот как: подключитесь как привилегированный пользователь (SYS
является одним из них, если вы не создали другого) и GRANT EXECUTE
в этом пакете с пользователем, который собирается его использовать.
Посмотритев примере: сначала он не будет работать (как вы уже заметили):
SQL> exec ctx_ddl.sync_index('idx_testo_interventi');
BEGIN ctx_ddl.sync_index('idx_testo_interventi'); END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'CTX_DDL' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Подключитесь как SYS
(или другой привилегированный пользователь, если он у вас есть):
SQL> connect sys@xe as sysdba
Enter password:
Connected.
SQL> grant execute on ctx_ddl to scott;
Grant succeeded.
Вернуться к владельцу таблицы interventi
(и индекса):
SQL> connect scott@xe
Enter password:
Connected.
SQL> exec ctx_ddl.sync_index('idx_testo_interventi');
PL/SQL procedure successfully completed.
SQL>
Кажется, все в порядке.