Sql

描述

通过 JDBC 对数据库执行一系列 SQL 语句。语句可以从使用 src 属性的文本文件读取,也可以从包含 SQL 标签的语句之间读取。

可以提供多个语句,用分号(或定义的 delimiter)分隔。语句中的各个行可以使用 --//REM 在行首进行注释。

autocommit 属性指定在执行语句时是否应打开或关闭自动提交。如果自动提交打开,则每个语句将被执行并提交。如果关闭,则所有语句将作为一个事务执行。

onerror 属性指定在执行其中一个语句时发生错误时如何继续。可能的值是:continue 执行,只显示错误;stop 执行,记录错误但不使任务失败;abort 执行和事务,并使任务失败。

代理。一些 JDBC 驱动程序(包括 Oracle thin 驱动程序)使用 JVM 的代理设置将它们的 JDBC 操作路由到数据库。自 Apache Ant 1.7 起,在 Java 5 或更高版本上运行的 Ant 默认使用 操作系统的代理设置。因此,OS 代理设置需要有效,或者使用 -noproxy 选项禁用 Ant 的代理支持。

参数

属性 描述 必需
driver jdbc 驱动的类名
url 数据库连接 URL
userid 数据库用户名
password 数据库密码
src 包含 SQL 语句的文件 是,除非语句包含在标签内
encoding 包含 SQL 语句的文件的编码 否;默认为默认 JVM 字符编码
outputencoding 保存结果的文件的编码。自 Ant 1.9.4 起 否;默认为默认 JVM 字符编码
delimiter 分隔 SQL 语句的字符串 否;默认为 ;;
autocommit 数据库连接的自动提交标志 否;默认为 false
print 打印语句的结果集 否;默认为 false
showheaders 打印语句结果集的标题 否;默认为 true
showtrailers 打印受影响行数的尾部 否;默认为 true
output 结果集的输出文件。自 Ant 1.8 起,可以指定任何支持输出的资源(参见 注释)。 否;默认打印到 System.out
append 输出是否应追加到现有文件或覆盖现有文件。 否;默认为 false,如果 output 未指定文件系统目标,则忽略。
classpath 用于加载驱动的类路径 否;默认为系统类路径
classpathref 要使用的类路径,作为对在其他地方定义的路径的 引用 给出。 否;默认为系统类路径
onerror 语句失败时要执行的操作:continuestopabort 否;默认为 abort
rdbms 仅当此 rdbms 时执行任务 否;默认情况下不受限制
version 仅当 rdbms 版本匹配时执行任务 否;默认情况下不受限制
caching 任务是否应缓存加载器和驱动程序? 否;默认为 true
delimitertype 控制分隔符是否只在单独一行上识别。
可以是 normal - 在行中的任何位置,或者 row,表示它必须在单独一行上
否;默认为 normal
keepformat 控制是否保留 SQL 的格式。
在加载包和过程时很有用。
否;默认为 false
escapeprocessing 控制 Java 语句对象是否执行转义替换。
有关详细信息,请参见 Statement 的 API 文档自 Ant 1.6 起
否;默认为 true
expandproperties 设置为 true 以在嵌套 SQL 中、任务内联或嵌套事务中打开属性扩展。自 Ant 1.7 起否;默认为 true
rawblobs 如果为 true,则在打印 BLOB 结果时将写入原始流而不是十六进制编码。自 Ant 1.7.1 起 否;默认为 false
failOnConnectionError 如果为 false,如果任务无法连接到数据库,则只会打印警告消息,不会执行任何语句。自 Ant 1.8.0 起 否;默认为 true
strictDelimiterMatching 如果为 false,则将不区分大小写地搜索分隔符(即 delimiter=go 匹配 GO),并将忽略周围的空格(delimiter=go 匹配 GO )。自 Ant 1.8.0 起 否;默认为 true
showWarnings 如果为 true,则 SQLWarnings 将在 warning 级别记录。自 Ant 1.8.0 起
注意:即使属性设置为 false,适用于连接的警告也会在 verbose 级别记录。
否;默认为 false
treatWarningsAsErrors 如果为 true,则 SQLWarnings 将被视为错误 - 并且通过 onError 属性选择的逻辑适用。自 Ant 1.8.0 起 否;默认为 false
csvColumnSeparator 打印结果时使用的列分隔符。自 Ant 1.8.0 起 否;默认为 ,
csvQuoteCharacter 用于引用列值的字符。
如果设置,包含列分隔符或引用字符本身的列将用引用字符包围。如果引用字符出现在列值内部,则引用字符本身将被加倍。
注意:BLOB 值永远不会被引用。自 Ant 1.8.0 起
否;默认情况下未设置(即从不进行引用)
forceCsvQuoteChar 如果为 true,则始终进行引用 否;默认情况下未设置(即仅在需要时进行引用)
errorproperty 在发生错误时要设置的属性的名称。自 Ant 1.8.0 起
warningproperty 在发生警告时要设置的属性的名称。自 Ant 1.8.0 起
rowcountproperty 要设置为第一个实际返回行计数的语句/事务更新的行数的属性的名称。自 Ant 1.8.0 起

作为嵌套元素指定的参数

transaction

使用嵌套的 <transaction> 元素指定要执行的多个命令块,这些命令块在同一个连接中但不同的事务中执行。当同一个模式下有多个文件要执行时,这特别有用。

属性 描述 必需
src 包含 SQL 语句的文件 是,除非语句包含在标签内

<transaction> 元素支持任何作为嵌套元素指定的 资源 或单个元素资源集合,以指定包含 SQL 语句的资源。

任何 资源 或资源集合

您可以通过嵌套的资源集合元素指定多个源。集合中的每个资源将在它自己的事务中运行。在 Ant 1.7 之前,只支持文件集。使用排序资源集合以获得可预测的事务顺序。

classpath

Sqlclasspath 属性是 路径状结构,也可以通过嵌套的 classpath 元素设置。它用于加载 JDBC 类。

connectionProperty

自 Ant 1.8.0 起

使用嵌套的 <connectionProperty> 元素指定连接到数据库时需要设置的附加 JDBC 属性。

属性 描述 必需
name 属性的名称
value 属性的值

示例

使用 org.database.jdbcDriver 连接到 url 中给出的数据库,作为 sa 用户,并执行文件 data.sql 中包含的 SQL 语句

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass"
     src="data.sql"/>

使用 org.database.jdbcDriver 连接到 url 中给出的数据库,作为 sa 用户,并执行文件 data.sql 中包含的 SQL 语句。还将属性 internal_logon 设置为值 SYSDBA

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass"
     src="data.sql">
  <connectionProperty name="internal_logon" value="SYSDBA">
</sql>

使用 org.database.jdbcDriver 连接到 url 中给出的数据库,作为 sa 用户,并执行两个 SQL 语句,将数据插入 some_table 并截断 some_other_table。嵌套文本中的 Ant 属性不会被扩展。

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass">
insert
into table some_table
values(1,2,3,4);

truncate table some_other_table;
</sql>

请注意,您可能希望将语句包含在 <![CDATA[ ... ]]> 部分中,这样您就不需要转义 <>& 或其他特殊字符。例如

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass"><![CDATA[

update some_table set column1 = column1 + 1 where column2 < 42;

]]></sql>

以下命令打开嵌套文本中的属性扩展(它纯粹是为了向后兼容而关闭),然后使用 Ant 属性在 HSQLDB 数据库中创建一个新用户。

<sql driver="org.hsqldb.jdbcDriver";
     url="jdbc:hsqldb:file:${database.dir}"
     userid="sa"
     password=""
     expandProperties="true">
  <transaction>
    CREATE USER ${newuser} PASSWORD ${newpassword}
  </transaction>
</sql>

以下连接到 url 中给出的数据库,作为 sa 用户,使用 org.database.jdbcDriver 并执行文件 data1.sqldata2.sqldata3.sql 中包含的 SQL 语句,然后对 some_other_table 执行截断操作。

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass">
  <transaction  src="data1.sql"/>
  <transaction  src="data2.sql"/>
  <transaction  src="data3.sql"/>
  <transaction>
    truncate table some_other_table;
  </transaction>
</sql>

以下示例与(并且如果还有更多与模式 data*.sql 匹配的文件,则可能会执行其他 SQL 文件)相同,但不保证 data1.sql 会在 data2.sql 之前运行。

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass">
  <path>
    <fileset dir=".">
      <include name="data*.sql"/>
    </fileset>
  </path>
  <transaction>
    truncate table some_other_table;
  </transaction>
</sql>

以下连接到 url 中给出的数据库,作为 sa 用户,使用 org.database.jdbcDriver 并执行文件 data.sql 中包含的 SQL 语句,并将输出管道到 outputfile.txt,并在系统类路径中搜索 /some/jdbc.jar 以及驱动程序类。

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass"
     src="data.sql"
     print="yes"
     output="outputfile.txt">
  <classpath>
    <pathelement location="/some/jdbc.jar"/>
  </classpath>
</sql>

以下仅当 RDBMS 为 oracle 且版本以 8.1. 开头时执行。

<sql driver="org.database.jdbcDriver"
     url="jdbc:database-url"
     userid="sa"
     password="pass"
     src="data.sql"
     rdbms="oracle"
     version="8.1.">
insert
into table some_table
values(1,2,3,4);

truncate table some_other_table;
</sql>