第 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~