2009-02-12 77 views
3

我們目前運行特定的SQL腳本,我們的螞蟻部署過程的一部分。如何將所有的sql文件應用到目錄中?

我們想要做的是改變這種做法,我們運行在一個給定的目錄中的所有SQL腳本。我們無法弄清楚如何在Ant中獲取此目錄列表,並遍歷列表並運行每個SQL腳本。有誰知道如何做到這一點?

注:我們目前正在使用運行「call sqlplus ${id}/${pw}@${db.instance} @${file}

回答

8

我會建議使用Ant SQL task螞蟻exec任務運行SQL文件。然後,您可以指定以下內容:

<sql 
    driver="org.database.jdbcDriver" 
    url="jdbc:database-url" 
    userid="sa" 
    password="pass"> 
    <path> 
    <fileset dir="."> 
     <include name="data*.sql"/> 
    </fileset> 
    <path> 
</sql> 
+0

要意識到,函數聲明中的ant sql任務'阻塞'。 我還不知道如何解決這個問題。 – NSherwin 2010-07-14 02:13:41

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> 
相關問題