Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 通过Ant脚本消除对动态SQL的依赖_Mysql_Eclipse_Ant - Fatal编程技术网

Mysql 通过Ant脚本消除对动态SQL的依赖

Mysql 通过Ant脚本消除对动态SQL的依赖,mysql,eclipse,ant,Mysql,Eclipse,Ant,我负责许多存储过程,其形式如下: 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_sq

我负责许多存储过程,其形式如下:

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
bar
表被更改时,只需在一个函数中进行更改,而不必在多个过程中进行更改。然而,这是以使用动态SQL以及一个额外函数为代价的,该函数每次调用时都会生成相同的字符串。我想知道是否有一种方法可以在运行前将工作移动到其他位置时保持可维护性

实际上,我们正在Eclipse中管理SQL,并在每次部署之前在数据库上运行这些文件之前,使用Ant对这些文件进行处理。有没有一种方法可以让Ant编写脚本来代替
getFooFields
的工作?我想象如下:

select distinct <%foofields%> from Foos
...
选择与Foos不同的
...
Ant将用一个字符串替换
,该字符串类似于
getFooFields
正在构建的字符串。当然,由于
getFooFields
需要参数,这一点更加复杂,因此我不确定这将如何工作


这个想法完全被误导了吗?我几乎没有和蚂蚁打交道的经验,所以我说不出来。或者,我还有什么其他方法可以消除这些过程对动态SQL的依赖,同时保持它们的可维护性呢?

如果
getFooFields
最常用于选择表
foo
中的所有字段,那么最好使用
select*fromfoo
而不是动态SQL和函数的组合

如果它是
foo
中经常作为一个组出现的字段子集,那么最好将该子集创建为一个视图并对该视图进行查询


如果
getFooFields
正在从另一个应用程序获取字段列表,以从
foo
中进行选择,那么您必须检查这是否有意义。
foo
中有多少字段?您多久只需要这些字段中的一小部分?您是否拉取了足够多的记录以使这种“优化”变得有意义?最有可能的是,你没有,而且如果你只需要拉公共字段或全部字段,你会得到更好的服务

如果
getFooFields
最常用于从表
foo
中选择所有字段,那么最好使用
select*from foo
而不是动态SQL和函数的组合

如果它是
foo
中经常作为一个组出现的字段子集,那么最好将该子集创建为一个视图并对该视图进行查询


如果
getFooFields
正在从另一个应用程序获取字段列表,以从
foo
中进行选择,那么您必须检查这是否有意义。
foo
中有多少字段?您多久只需要这些字段中的一小部分?您是否拉取了足够多的记录以使这种“优化”变得有意义?最有可能的是,你没有,而且如果你只需要拉公共字段或全部字段,你会得到更好的服务

getFooFields更常用于选择
foo
中的所有字段还是常用子集?@RobAllen-它用于从
Foos
的常用连接中选择大多数字段,等等。请看下面我答案的第二行。getFooFields更常用于选择
foo
中的所有字段还是常用的子集?@RobAllen-它用于从经常使用的
Foos
连接中选择大多数字段,请看下面我回答的第二行。+1您是对的,可以使用视图来代替。我不得不问为什么上一个开发人员没有这样做。我得到的一个简单解释是,一些调用此函数的进程使用左连接,而其他进程使用内部连接,因此在这种不幸的情况下,不可能使用视图来代替。你说得对,可能会使用视图来代替。我不得不问为什么上一个开发人员没有这样做。我得到的解释是,一些调用此函数的进程使用左连接,而其他进程使用内部连接,因此在这种不幸的情况下,不可能使用视图。