Если оператор IF
действителен только в составном блоке SQL (т. Е. Внутри блока хранимой процедуры / процедуры / функции / анонимного блока).
Он недопустим автономно, как показывает ваш вопрос и именно поэтому Db2 выдает ошибку -104.
Вы можете посмотреть объяснение sqlcode -104, просмотрев SQL0104N в бесплатном онлайн-центре знаний Db2 по этой ссылке .
Чтобы иметь возможность использовать состав- SQL в вашем инструменте Squirrel- SQL, вам необходимо настроить белка для использования альтернативного терминатора оператора. Google это. В приведенных ниже примерах я показываю терминатор оператора @ (для разделения блока).
Вот два разных способа сделать то, что вы хотите с Db2-Linux / Unix / Windows, каждый из которых использует анонимный блок. Возможны и другие подходы.
В этом примере drop-index будет работать только в том случае, если имя-индекс существует в текущей схеме:
begin
declare v_index_exists integer default 0;
select 1 into v_index_exists
from syscat.indexes
where indname = 'TEST_CREATE_INDEX_OLD';
if v_index_exists = 1
then
execute immediate('drop index TEST_CREATE_INDEX_OLD');
execute immediate('create index TEST_CREATE_INDEX_NEW on example_table ( id, another_field)');
end if;
end@
В этом примере drop-index всегда будет работать, но блок не будет прерван, если индекс не существует (то есть он продолжит работу и не выдаст никакой ошибки).
begin
declare v_no_such_index integer default 0;
declare not_exists condition for sqlstate '42704';
declare continue handler for not_exists set v_no_such_index=1;
execute immediate('drop index TEST_CREATE_INDEX_OLD');
execute immediate('create index TEST_CREATE_INDEX_NEW on example_table ( id, another_field)');
end@