sql >> データベース >  >> RDS >> Oracle

Oracle-XMLTYPE:値を更新する方法

    @АнатолийПредеинの答えは10gと11gで間違いなく正しいですが、updatexmlに注意する必要があります。 Oracle12cでは非推奨になりました。

    12cR1以降、XMLを操作するための推奨される方法はXQueryUpdateFacilityです。これはOracleに固有のものではありませんが、W3C勧告は他の多くのXMLツールも実装しています。

    以下に完全な例を示します。ただし、XQueryの詳細については説明しませんが、代わりに次のドキュメントを紹介します。

    • せっかちな人のためのXQueryアップデート
    • OracleXMLDB開発者ガイドからのXMLノードの置き換え

    セットアップ例

    create table so61_t(
     id number
    ,xml xmltype
    );
    
    insert into so61_t values(1, '<?xml version="1.0" encoding="WINDOWS-1252"?>
    <View>
        <ReportValues>
            <SalaryValue variable="HR" value="999"/>
            <SalaryValue variable="floor" value="20"/>
        </ReportValues>
    </View>');
    
    insert into so61_t values(2, '<?xml version="1.0" encoding="WINDOWS-1252"?>
    <View>
        <ReportValues>
            <SalaryValue variable="HR" value="998"/>
            <SalaryValue variable="floor" value="19"/>
        </ReportValues>
    </View>');
    

    XMLを変更する

    update so61_t set xml =
    xmlquery(
    'copy $t := $x modify(
      (for $i in $t/View/ReportValues/SalaryValue[@variable="HR"]/@value
       return replace value of node $i with ''666'')
     ,(for $i in $t/View/ReportValues/SalaryValue[@variable="floor"]/@value
       return replace value of node $i with ''SALES'')
    ) return $t'
    passing xml as "x" returning content
    )
    where id = 1
    ;
    

    結果

    SQL> col id for 99
    SQL> col xml for a78
    SQL> select id, xmlserialize(content xml as varchar2(200)) as xml from so61_t;
     ID XML
    --- -------------------------------------------------
      1 <?xml version="1.0" encoding="UTF-8"?>
        <View>
          <ReportValues>
            <SalaryValue variable="HR" value="666"/>
            <SalaryValue variable="floor" value="SALES"/>
          </ReportValues>
        </View>
      2 <?xml version="1.0" encoding="UTF-8"?>
        <View>
          <ReportValues>
            <SalaryValue variable="HR" value="998"/>
            <SalaryValue variable="floor" value="19"/>
          </ReportValues>
        </View>
    
    SQL>
    


    1. OracleのNLS_UPPER()関数

    2. SQLServerのデータベースからすべてのトリガーを削除または削除する方法

    3. Microsoft SQL Server 2012 Enterprise Edition(Service Pack 1付き)のインストール

    4. 更新クエリの最適化