На меня возложена ответственность за ряд хранимых процедур, которые принимают форму:
create procedure getFoos()
begin
set @v_sql := '';
set @v_sql := concat(@v_sql, 'select distinct ', getFooFields('f', 'b'), ' ');
set @v_sql := concat(@v_sql, 'from Foos f ');
set @v_sql := concat(@v_sql, ' left join Bars b on f.barID= b.barID');
set @v_sql := concat(@v_sql, 'where f.someDate is null ');
set @v_sql := concat(@v_sql, ' and b.someID in (1, 2, 3) ');
set @v_sql := concat(@v_sql, ' and b.someBool = true ');
set @v_sql := concat(@v_sql, 'order by f.name ');
prepare s1 from @v_sql;
execute s1;
deallocate prepare s1;
end;
Как видите, используется динамический SQL, чтобы можно было встроить функцию getFooFields
,Эта функция используется просто для построения строки выбранных полей:
create function getFooFields(
i_aliasForFoo varchar(32),
i_aliasForBar varchar(32)
) returns text
reads sql data
begin
declare v_fields text default '';
set v_fields := concat(v_fields, i_aliasForFoo, '.fooID as fooId', ', ');
set v_fields := concat(v_fields, i_aliasForFoo, '.someDate as someDate ', ', ');
set v_fields := concat(v_fields, i_aliasForFoo, '.name as name', ', ');
-- additional Foo fields
set v_fields := concat(v_fields, i_aliasForBar, '.someID as someID ', ', ');
set v_fields := concat(v_fields, i_aliasForBar, '.someBool as someBool ', ', ');
-- additional Bar fields
return v_fields;
end;
Причина этого, по-видимому, заключается в улучшении удобства обслуживания - когда изменяются таблицы Foos
или Bars
, изменения должныбыть сделано в одной функции вместо многих процедур.Однако это происходит за счет использования динамического SQL, а также дополнительной функции, которая создает одну и ту же строку каждый раз, когда она вызывается.Мне интересно, есть ли способ сохранить удобство сопровождения при переносе работы до времени выполнения.
Как это происходит, мы управляем нашим SQL в Eclipse и используем Ant для массирования этих файлов перед запуском их в базу данных.до каждого развертывания.Есть ли способ, которым мы могли бы сценарий Ant сделать работу getFooFields
вместо этого?Я представляю что-то вроде следующего:
select distinct <%foofields%> from Foos
...
Где Ant заменит <%foofields%>
на строку, аналогичную той, которую строит getFooFields
.Но, конечно, это еще более осложняется тем фактом, что getFooFields
принимает параметры, поэтому я не уверен, как это будет работать.
Является ли эта идея полностью ошибочной?У меня почти нет опыта работы с Ant, поэтому я не могу сказать.В качестве альтернативы, каким другим способом я мог бы удалить зависимость этих процедур от динамического SQL, сохраняя их поддерживаемыми?