Sql

說明

透過 JDBC 執行一系列 SQL 陳述式至資料庫。陳述式可以透過 src 屬性從文字檔讀取,或從 SQL 標籤之間讀取。

可以提供多個陳述式,並以分號 (或定義的 delimiter) 分隔。陳述式內的個別行可以在行首使用 --//REM 註解。

autocommit 屬性指定在執行陳述式時是否開啟自動提交。如果自動提交開啟 on,每個陳述式都會執行並提交。如果關閉 off,所有陳述式都會作為一個交易執行。

onerror 屬性指定在執行其中一個陳述式時發生錯誤時如何進行。可能的數值有:continue 執行,只顯示錯誤;stop 執行,記錄錯誤但不要讓任務失敗;abort 執行和交易,並讓任務失敗。

代理。某些 JDBC 驅動程式 (包括 Oracle thin 驅動程式) 使用 JVM 的代理設定將其 JDBC 作業路由至資料庫。自 Apache Ant 1.7 起,在 Java 5 或更新版本上執行的 Ant 預設為 使用作業系統的代理設定。因此,作業系統代理設定必須有效,或使用 -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 陳述式物件是否應執行跳脫字元替換。
請參閱 陳述式的 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>

下列指令會使用 org.database.jdbcDriver 連線到 url 中指定的資料庫,並使用 sa 使用者身分執行 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>

下列指令會使用 org.database.jdbcDriver 連線到 url 中指定的資料庫,並使用 sa 使用者身分執行 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>