1

XML タイプ列で作成された Oracle ビューからデータを取得しようとしています。
例: 以下は XSD です。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="MsrFact" type="MsrNode"/>
<xsd:complexType name="MsrNode">
<xsd:sequence>

<xsd:element name="shipTo" type="MsrValue"/>
<xsd:element name="billTo" type="MsrValue"/>
<xsd:element name="FormulaeItem"  type="MsrValue" maxOccurs="10"/>
</xsd:sequence>
</xsd:complexType> <xsd:complexType name="MsrValue">
<xsd:sequence>

<xsd:element name="name"   type="xsd:string"/>
<xsd:element name="street" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType> </xsd:schema>


挿入されたxmlは次のとおりです。

<MsrFact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MsrNode>

  <shipTo>
     <name>shipTo</name>
   </shipTo>

   <billTo>
     <name>billTo</name>
   </billTo>

  <FormulaeItem>
    <name>FormulaeItem1</name>
  </FormulaeItem>

  <FormulaeItem>
     <name>FormulaeItem2</name>
     <street>100</street>
  </FormulaeItem>

  <FormulaeItem>
     <name>FormulaeItem3</name>
   </FormulaeItem>
</MsrNode> </MsrFact>

テーブル: temptab( ogrid number(10), xdata xmltype);

見る: CREATE OR REPLACE VIEW
MsrFactView(orgid,shipTo,shipToR, billTo,billToR, FormulaeItem,FormulaeItemR)
AS SELECT ogrid,
extractValue(xdata, '/MsrFact/shipTo/name'),
extractValue(xdata, '/MsrFact/shipTo/street'),
extractValue(xdata, '/MsrFact/billTo/name'),
extractValue(xdata, '/MsrFact/billTo/street'),
extractValue(xdata, '/MsrFact/FormulaeItem/name'),
extractValue(xdata, '/MsrFact/FormulaeItem/street')
FROM temptab;

エラー SQL エラーが発生するため、このビューに直接選択クエリを作成できません
: ORA-01427: 単一行のサブクエリが複数の行を返します 01427
.

このビューからデータを取得する方法はありますか? ありがとう !

4

1 に答える 1

3

extractValue は指定されたパスから 1 つの値のみを抽出しますが、FormulaeItem は多数になる可能性があるため、ここでは extractValue を使用できません。さらに、extractValue を使用することは、XML を照会するための古い方法であり、推奨されていません。新しい XMLTable アプローチを使用する必要があります。

create or replace view MsrFactView as
select tt.ogrid,
st.name shiptoName, st.street shiptoStreeet,
bt.name billtoName ,bt.street billtoStreet,
fi.name formulaeitemname ,fi.street formulaeitemstreet
FROM
temptab tt,
XMLTABLE(
    '/MsrFact/MsrNode'
    passing tt.xdata
    columns
        shipto  XMLTYPE path '/MsrNode/shipTo'
        billto  XMLTYPE path '/MsrNode/billTo'
        formulaeitem XMLTYPE path '/MsrNode/FormulaeItem'
) nd,
XMLTable (
    '/shipTo'
    passing nd.shipto
    columns
    name varchar2(4000) path '/shipTo/name'
    street number path '/shipTo/street'
) st,
XMLTABLE (
    '/billTo'
    passing nd.billto
    columns
    name varchar2(4000) path '/billTo/name'
    street number path '/billTo/street'
) bt,
XMLTable (
    '/FormulaeItem'
    passing nd.formulaeitem
    columns
    name varchar2(4000) path '/FormulaeItem/name'
    street number path '/FormulaeItem/street'
) fi
/

ただし、MsrNode ごとに 1-n の FormulaeItem があるため、1 つの「MsrNode」ごとに 1 つの行を取得できないことに注意してください。1 対 n の関係を持つ 2 つのテーブルを結合する SQL クエリと考えてください。その場合と同様に、親テーブルの 1 行ごとに「n」行を取得します。

したがって、あなたの場合、すべての MsrNode ごとに、そのノードの FormulaeItems の数と同じ数の行がビューに表示されます。

于 2012-04-09T13:08:26.600 に答える