1

Oracle システムに XML ベースの監査を使用しています。各テーブルには、データベース内の単一の監査テーブルに挿入または更新されるレコードの XML 表現を作成するためのトリガーがあります。監査データのキャプチャは適切に機能していますが、Oracle の XML 解析ユーティリティを使用して情報を抽出する際に問題が発生しています。

例として Gender テーブルを使用すると、監査テーブルには次のような XML 列があります。

<?xml version = '1.0'?>
<ROWSET>
   <ROW num="1">
     <GENDER_ID>2</GENDER_ID>
     <GENDER>Male</GENDER>
     <GENDER_CODE>M</GENDER_CODE>
     <LAST_MODIFIED_BY_USER>bob.smith</LAST_MODIFIED_BY_USER>
     <LAST_MODIFIED_BY_DATE>08-JUN-13</LAST_MODIFIED_BY_DATE>
   </ROW>
</ROWSET>

XML を 2 つの形式のいずれかに解析できるようにしたいと考えています。

  • ROW 要素内の各属性名は列になり、各属性値は列の下の値になります。OR
  • 各属性名と値の組み合わせは、独自の行にあります

次のスクリプトを使用して、各属性の値を取得できます。

select extractValue(n.column_value, '/*') as Value
from (
      select extract(XMLType(at.xml), '//ROWSET/ROW') as data from audit_table at
      where at.audit_id = 1
     ) x, 
TABLE (xmlSequence(extract(x.data,'/ROW/*'))) n

これにより、単一の「値」列を含む 5 つの行が生成されます。

  • 2
  • M
  • ボブ・スミス
  • 2013 年 6 月 8 日

値自体はほとんど役に立たず、属性名を値に関連付ける方法がわかりません。関連する列に属性名 (つまり、GENDER_ID または GENDER_CODE) を取得する方法はありますか?

XML の要素が何であるかを知っていれば、XML の構文解析の例はたくさんあります。この例では、監査テーブルは、性別 (5 列) の XML と、幅広い列名と番号を持つ他のテーブルの XML を保持します。

列の値を抽出できるので、属性名も確実に抽出できると思いますが、わかりません。

前もってありがとう、ティム

4

1 に答える 1

2

getrootelement()関数を使用して、属性名を取得できます。例、

SELECT EXTRACTVALUE (n.COLUMN_VALUE, '/*') AS NODE_VALUE,
       n.COLUMN_VALUE.getrootelement () AS NODE_NAME
  FROM (SELECT EXTRACT (
                  XMLType (
                     '<?xml version = ''1.0''?>
<ROWSET>
   <ROW num="1">
     <GENDER_ID>2</GENDER_ID>
     <GENDER>Male</GENDER>
     <GENDER_CODE>M</GENDER_CODE>
     <LAST_MODIFIED_BY_USER>bob.smith</LAST_MODIFIED_BY_USER>
     <LAST_MODIFIED_BY_DATE>08-JUN-13</LAST_MODIFIED_BY_DATE>
   </ROW>
</ROWSET>'),
                  '//ROWSET/ROW')
                  AS data
          FROM DUAL) x,
       TABLE (XMLSEQUENCE (EXTRACT (x.data, '/ROW/*'))) n

出力:

NODE_VALUE    NODE_NAME
-----------------------------------
2             GENDER_ID
Male          GENDER
M             GENDER_CODE
bob.smith     LAST_MODIFIED_BY_USER
08-JUN-13     LAST_MODIFIED_BY_DATE
于 2013-06-08T01:20:32.830 に答える