Устранение зависимости от динамического SQL с помощью скриптов Ant - PullRequest
1 голос
/ 13 января 2012

На меня возложена ответственность за ряд хранимых процедур, которые принимают форму:

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, сохраняя их поддерживаемыми?

1 Ответ

1 голос
/ 13 января 2012

Если getFooFields чаще всего используется для выбора всех полей из таблицы foo, тогда лучше использовать select * from foo, чем комбинацию динамического SQL и функции.

Если это подмножество полей в foo, которые часто встречаются как группа, то вам может быть лучше, если вы создадите это подмножество как представление и запросите его против представления.

Если getFooFields берет список полей из другого приложения для выбора из foo, то вам нужно проверить, имеет ли это смысл.Сколько полей в foo?Как часто вам нужно только небольшое количество этих полей?Вы тянете достаточно большое количество записей, чтобы этот тип «оптимизации» имел смысл?Скорее всего, вам и не лучше, если вы просто потянете общие поля или все из них.

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