第 4 課: 更新儲存在 XML 直欄中的 XML 文件
本課程教您如何使用 UPDATE SQL 陳述式 (含或不含 XQuery 更新表示式) 來更新 XML 文件。
在沒有 XQuery 更新表示式的情況下更新
如果您使用 UPDATE 陳述式而沒有 XQuery 更新表示式,則必須執行完整文件更新。
To update the values of the <street>, <city>, and <pcode-zip> elements for one of the documents that you inserted in Lesson 3, issue the following statement:
UPDATE customer SET info =
'<customerinfo xmlns="http://posample.org" Cid="1002">
<name>Jim Noodle</name>
<addr country="Canada">
<street>1150 Maple Drive</street>
<city>Newtown</city>
<prov-state>Ontario</prov-state>
<pcode-zip>Z9Z 2P2</pcode-zip>
</addr>
<phone type="work">905-555-7258</phone>
</customerinfo>'
WHERE XMLEXISTS (
'declare default element namespace "http://posample.org";
$doc/customerinfo[@Cid = 1002]'
passing INFO as "doc")~
XMLEXISTS 述詞可確保只取代包含屬性 Cid=" 1002 " 的文件。 請注意 XMLEXISTS [@Cid = 1002] 中的述詞表示式未指定為字串比較: [@Cid = "1002"]。 原因是您在練習 2 中建立 Cid 屬性的索引時使用 DOUBLE 資料類型。 若要讓索引符合此查詢,您無法在述詞表示式中指定 Cid 作為字串。
若要確認已更新 XML 文件,請發出下列陳述式:
SELECT * from Customer~
The record containing Cid="1002" contains the changed <street>, <city>, and <pcode-zip> values.如果您可以使用相同表格的非 XML 直欄中的值來識別表格中的 XML 文件,則可以使用 SQL 比較述詞來識別要更新哪些列。 在前一個範例中, XML 文件中的 Cid 值也儲存在 CUSTOMER 表格的 CID 直欄中,您可以在 CID 直欄上使用 SQL 比較述詞來識別列。 在前一個範例中,您可以將 WHERE 子句取代為下列子句:
WHERE Cid=1002
使用 XQuery 更新表示式更新
如果您搭配使用 UPDATE 陳述式與 XQuery 更新表示式,則可以更新現有 XML 文件的部分。
若要更新現有 XML 文件中的客戶位址,請發出下列 SQL 陳述式,其使用 XQuery 轉換表示式:
UPDATE Customer set Info =
XMLQUERY( 'declare default element namespace "http://posample.org";
transform
copy $mycust := $cust
modify
do replace $mycust/customerinfo/addr with
<addr country="Canada">
<street>25 EastCreek</street>
<city>Markham</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N9C 3T6</pcode-zip>
</addr>
return $mycust'
passing INFO as "cust")
WHERE CID = 1002~
為了更新客戶位址, XMLQUERY 函數會執行使用取代表示式的 XQuery 轉換表示式,然後將更新的資訊傳回 UPDATE 陳述式,如下所示:
- XMLQUERY 傳遞子句會使用 ID
cust
,將客戶資訊從 XML 直欄 INFO 傳遞至 XQuery 表示式。 - 在轉換表示式的 copy 子句中,會取得客戶資訊的邏輯 Snapshot ,並指派給
$mycust
變數。 - 在轉換表示式的 modify 子句中,取代表示式會取代客戶資訊副本中的位址資訊。
- XMLQUERY 會在
$mycust
變數中傳回已更新的客戶文件。
若要確認 XML 文件包含已更新的客戶地址,請發出下列陳述式:
SELECT Info FROM Customer WHERE Cid = 1002~