ORA-06550 Почему я не могу создать индекс внутри if-else в Oracle - PullRequest
1 голос
/ 21 июля 2011

Я не семья с PL / SQL.Может кто-нибудь объяснить, почему я не могу сделать следующее?

BEGIN
  IF TRUE THEN
    CREATE INDEX TestIndex ON SomeTable (SomeColumn);
  END IF;
END;

Я получил бы следующую ошибку:

Отчет об ошибке: ORA-06550: строка 3, столбец 5: PLS-00103: Обнаружен символ «CREATE» при ожидании одного из следующих действий: начать регистр объявить выход для goto, если цикл mod null прагма Повышение возвращение выбрать обновление, в то время как при << закрыть текущий удалить выборку заблокировать вставить вставить открытый откат набор точек сохранения sql выполнить commit forall merge pipe 06550. 00000 - «строка% s, столбец% s: \ n% s» * Причина: обычно ошибка компиляции PL / SQL.* Действие: </p>

Единственный способ обойти эту ошибку - сделать динамический sql:

BEGIN
  IF TRUE THEN
    EXECUTE IMMEDIATE 'CREATE INDEX TestIndex ON SomeTable (SomeColumn)';
  END IF;
END;

1 Ответ

5 голосов
/ 21 июля 2011

Oracle не допускает использование DDL в блоке PL / SQL в качестве статического SQL, поэтому вы определили единственный обходной путь (ну, технически вы могли бы использовать DBMS_SQL вместо EXECUTE IMMEDIATE, но вам все равно придется иметь дело с динамическим SQL) ,

Я не знаю, что есть какая-то техническая причина, по которой они не могут использовать DDL в статическом SQL. Но поскольку в 99% случаев вам не следует использовать DDL в хранимой процедуре - создание объектов - это то, что почти всегда выполняется при развертывании, а не во время выполнения, - заставляя людей использовать динамический SQL, разработчики делают паузу, чтобы подумать, действительно ли они находятся в том 1% случаев, когда такая вещь имеет смысл.

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