1

SQL (Oracle) ステートメントに入る XPath ステートメントを修正して、以下の XML からモデルの価格を抽出するのを手伝ってもらえますか<BrandName>。そのモデル名は「Bravo」で、モデル名は「XYZ789」です。

<CarDetails>
<Wheels>
    <Rims>
        <BrandName>Acme</BrandName>
        <Model>
            <Name>ABC123</Name>
            <Price>$350.00</Price>
        </Model>

    </Rims>
    <Rims>
        <BrandName>Bravo</BrandName>
        <Model>
            <Name>XYZ789</Name>
            <Price>$250.00</Price>
        </Model>
        <Model>
            <Name>GHI456</Name>
            <Price>$300.00</Price>
        </Model>
    </Rims>
</Wheels>
</CarDetails>

上記の XML Clob はCars、「id」、「version」、および「xml_document」というタイトルの列を持つ という Oracle テーブルに格納されます。

必要な情報を抽出するための SQL ステートメントは次のようになります。

SELECT * 
FROM ( 
  SELECT x.xml_document.GetClobVal() 
  FROM Cars x 
  WHERE
    extractValue(x.xml_document,
      '/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model/b:Name',
      'xmlns:a="cars:instance:3_1" xmlns:b="cars:conceptualcomponent:3_1"'
    ) in ('XYZ789')
  ORDER BY x.id, x.version
) 
where ROWNUM <= 100

...しかし、それはまったく情報を引き出しません。1 つのレコードを引き出す必要があります。データが XML に存在することは確かです。このステートメントは、extractValue呼び出し内で XPath を変更して他の値を取得すると機能するため、SQL の XPath が間違っていることは明らかです。

/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model/b:Name

extractValueSQLコマンドのXPathがどのように見えるべきかについて、誰か提案できますか?

前もって感謝します。

4

2 に答える 2

2

ブランド名が「Bravo」でモデル名が「XYZ789」の車の価格が必要な場合は、次の XPath で取得する必要があります。

/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model[b:Name="XYZ789"]/b:Price

実際、これが実際の動作です:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2     v_xml_string     VARCHAR2(4000) := '<a:CarDetails xmlns:a="cars:instance:3_1">
  3  <b:Wheels xmlns:b="cars:conceptualcomponent:3_1">
  4      <b:Rims>
  5          <b:BrandName>Acme</b:BrandName>
  6          <b:Model>
  7              <b:Name>ABC123</b:Name>
  8              <b:Price>$350.00</b:Price>
  9          </b:Model>
 10
 11      </b:Rims>
 12      <b:Rims>
 13          <b:BrandName>Bravo</b:BrandName>
 14          <b:Model>
 15              <b:Name>XYZ789</b:Name>
 16              <b:Price>$250.00</b:Price>
 17          </b:Model>
 18          <b:Model>
 19              <b:Name>GHI456</b:Name>
 20              <b:Price>$300.00</b:Price>
 21          </b:Model>
 22      </b:Rims>
 23  </b:Wheels>
 24  </a:CarDetails>';
 25      v_result    VARCHAR2(4000);
 26  BEGIN
 27    SELECT extractValue(XMLTYPE(v_xml_string),
 28        '/a:CarDetails/b:Wheels/b:Rims[b:BrandName="Bravo"]/b:Model[b:Name="XYZ789"]/b:Price',
 29        'xmlns:a="cars:instance:3_1" xmlns:b="cars:conceptualcomponent:3_1"'
 30      ) INTO v_result FROM DUAL;
 31
 32     dbms_output.put_line(v_result);
 33  END;
 34  /
$250.00

PL/SQL procedure successfully completed.

SQL>

XML で XPath を実行しようとしたとき (名前空間ab名前空間を追加した後)、「ORA-19025: EXTRACTVALUE は 1 つのノードのみの値を返します」というエラーが発生しました。これはEXTRACTVALUE、単一の結果ノードを返す XPath しか処理できないためです。XML には、XPath に一致する 2 つのノードがあります。<Name>内容を持つ 2 つの要素XYZ789GHI456.

于 2013-03-21T21:07:18.123 に答える
1

extractvalue ステートメントで、xml データに存在しない名前空間を宣言します (少なくとも、投稿したスニペットには存在しません)。名前空間とローカル名を extractvalue ステートメントから削除するか、データベースの xml に追加します。

于 2013-03-21T11:25:28.490 に答える