我们目前在Ant部署过程中运行特定的SQL脚本。
我们要做的是更改此内容,以便在给定目录中运行所有SQL脚本。我们无法弄清楚如何在Ant中获取此目录列表并遍历列表并运行每个SQL脚本。有谁知道怎么做?
注意:我们当前使用运行“exec
”的Ant call sqlplus ${id}/${pw}@${db.instance} @${file}
任务运行sql文件
答案 0 :(得分:8)
我建议使用Ant SQL
task。然后,您可以使用以下内容进行指定:
<sql
driver="org.database.jdbcDriver"
url="jdbc:database-url"
userid="sa"
password="pass">
<path>
<fileset dir=".">
<include name="data*.sql"/>
</fileset>
<path>
</sql>
答案 1 :(得分:0)
我在oracle数据库上做的基本相同..但是使用sqlplus和apply任务。这允许脚本包含DDL语句。
显然只能在您使用命令行程序的地方工作。 使用ant 1.8.2和antcontrib。
我已经定义了一些宏用于..(见下文)然后只需调用
<compile_sql connectstring="${db.connect_string}" >
<filelist dir="${db_proc.dir}" files="specific_file.sql" />
<fileset dir="${db_proc.dir}" includes="wildcard*.pks" />
<fileset dir="${db_proc.dir}" includes="wildcard*.pkb" />
</compile_sql>
宏如下
<macrodef name="compile_sql">
<attribute name="connectstring" />
<attribute name="dirtostart" default=""/>
<attribute name="arg1" default=""/>
<element name="sqllist" implicit="true" description="filesetlist of sql to run"/>
<sequential>
<check_missing_files>
<sqllist/>
</check_missing_files>
<apply executable="${sqlplus.exe}" failonerror="true" verbose="true" skipemptyfilesets="true" ignoremissing="false" dir="@{dirtostart}">
<arg value="-L"/>
<arg value="@{connectstring}"/>
<srcfile prefix="@" />
<sqllist/>
<arg value="@{arg1}"/>
<redirector>
<globmapper id="sqlout.mapper"
from="*"
to="*.out"/>
</redirector>
</apply>
</sequential>
</macrodef>
和
<macrodef name="check_missing_files">
<element name="checkfilelist" implicit="true" description="filelist of files to check for existance"/>
<sequential>
<restrict id="missing.files" xmlns:rsel="antlib:org.apache.tools.ant.types.resources.selectors">
<resources>
<checkfilelist/>
</resources>
<rsel:not>
<rsel:exists/>
</rsel:not>
</restrict>
<fail message="These files are missing: ${ant.refid:missing.files}" >
<condition >
<length string="${ant.refid:missing.files}" when="greater" length="0" />
</condition>
</fail>
</sequential>
</macrodef>