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 を保持します。
列の値を抽出できるので、属性名も確実に抽出できると思いますが、わかりません。
前もってありがとう、ティム