Создать индекс по столбцу CLOB - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть таблица interventi, которая имеет такую ​​структуру

describe interventi;
Name                           Null     Type
------------------------------ -------- -----------------------
DATAORA                        NOT NULL TIMESTAMP(6)
PARLAMENTARE                   NOT NULL VARCHAR2(16)
TESTO                          NOT NULL CLOB()

, где поданное dataora является первичным ключом.Я заполнил эту таблицу строкой сиглов

DATAORA                         PARLAMENTARE     TESTO
------------------------------- ---------------- ------------------------------- 
05-JUL-18 12.00.00.000000000 AM MRTMRZ           (CLOB) PIPPO PLUTO PAPERINO

1 rows selected

Теперь я хочу создать индекс на поле testo

create index idx_testo_interventi
on interventi(testo) indextype is
ctxsys.context;

, но

Error starting at line 1 in command:
create index idx_testo_interventi
on interventi(testo) indextype is
ctxsys.context
Error at Command Line:1 Column:13
Error report:
SQL Error: 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
29855. 00000 -  "error occurred in the execution of ODCIINDEXCREATE routine"
*Cause:    Failed to successfully execute the ODCIIndexCreate routine.
*Action:   Check to see if the routine has been coded correctly.

Как я могусоздать индекс?

1 Ответ

0 голосов
/ 23 сентября 2018

Небольшая настройка может помочь.

Вот что не работает:

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>

Кажется, все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...