Почему я получаю ORA-00904: неверный идентификатор для индекса детерминированной функции? - PullRequest
0 голосов
/ 23 мая 2018
create or replace function idxF(status IN char) return char deterministic is
retVal CHAR(1);
begin
  dbms_output.put_line('P');
  retVal:=CASE status
  when 'P' then 'P'
  when 'H' then 'H'
  else null
  end  ;
  return retVal;
end idxF;
  create index setIndexOnStatus on ORDER(idXF(STATUS));

  SQL Error: ORA-00904: "IDXF": invalid identifier

STATUS - это столбец CHAR(1) в таблице ORDER.

Почему компилятор говорит, что IDXF является недопустимым идентификатором?

1 Ответ

0 голосов
/ 23 мая 2018

ORDER - зарезервированное слово в Oracle (часть предложения ORDER BY), поэтому его не следует использовать в качестве имени для таблицы.

Технически, вы можете экранировать зарезервированное слово с двойными кавычками:

create index setIndexOnStatus on "ORDER"(idXF(STATUS));

Возможно, эта таблица была создана именно таким образом.

Этот подход чрезвычайно проблематичен, потому что вам нужно экранировать каждый запрос к этой таблице, и это не всегда возможно, особенно с автоматически сгенерированными запросами.

Так что не идите этим путемпереименуйте таблицу.

PS Я не смог воспроизвести ORA-00904 в этом запросе.Неверное имя таблицы приводит к ORA-00903: invalid table name.Экранированный запрос прекрасно работает для меня.Если у вас все еще есть ошибка ORA-00904, вам нужно будет собрать воспроизводимый пример , чтобы продемонстрировать вашу проблему (то есть включить оператор CREATE TABLE и указать версию Oracle).

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