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

Я использую 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 ответ

Решение

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

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

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