如何在目录中应用所有sql文件?

时间:2009-02-12 15:52:41

标签: sql ant

我们目前在Ant部署过程中运行特定的SQL脚本。

我们要做的是更改此内容,以便在给定目录中运行所有SQL脚本。我们无法弄清楚如何在Ant中获取此目录列表并遍历列表并运行每个SQL脚本。有谁知道怎么做?

注意:我们当前使用运行“exec”的Ant call sqlplus ${id}/${pw}@${db.instance} @${file}任务运行sql文件

2 个答案:

答案 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>