Условный индекс DROP в db2 - PullRequest
       11

Условный индекс DROP в db2

0 голосов
/ 20 декабря 2011

Я использую IBM DB2 9.7.2 в Debian GNU / Linux. Мне нужен условный индекс DROP, только если он существует. Поскольку это не поддерживается, я написал процедуру, которая принимает IN idx_name VARCHAR (128) в качестве имени индекса. В этой процедуре я проверяю, существует ли индекс с таким именем в SYSCAT.INDEXES, и если да, я выполняю

DROP INDEX idx_name;

Но, очевидно, DROP INDEX не принимает строку.

В качестве альтернативы я попытался использовать SYSPROC.SYSTS_DROP (), но он выдал ошибку:

SQL20427N Ошибка во время процедуры администрирования текстового поиска или команда. Сообщение об ошибке «CIE00340 не удается запустить исполняемую программу "Cieadmsv". ". SQLSTATE = 38H14

Возможно, я мог бы изменить процедуру, чтобы удалить этот индекс и перехватить исключение, чтобы не возникало ошибок, если его не существует, но я все еще не знаю: как я могу заставить DROP INDEX принимать переменную

1 Ответ

2 голосов
/ 20 декабря 2011

DROP INDEX, как и большинство SQL, не принимает параметры для идентификаторов (вы не можете сделать это с помощью SELECT операторов).Я ожидаю, что это связано с тем, что оптимизатор пытается проверить / подготовить оператор - вы можете указать их только для столбца содержимое , в конце концов.

У вас есть два варианта:

  1. Использование динамического SQL для создания оператора, PREPARE и EXECUTE.Вы должны быть в состоянии сделать это из вашей хранимой процедуры.Тем не менее, я был бы осторожен с этим, так как это может позволить посторонним лицам удалять признаки (в зависимости от того, как настроена процедура).
  2. Игнорировать ошибку.В частности, игнорируйте SQLCODE -204 (ну, это код iSeries DB2).Так что, если его не существует?В любом случае мы пытались удалить его ... Другие ошибки по-прежнему следует сообщать / исправлять.
...