1

Oracle データベースにある XML からさまざまなデータを選択しようとしています。次に、それらの項目を通常の SQL クエリ用の別のテーブルに挿入できます (つまり、XML を細断処理します)。したがって、Oracle データベースの Clob 列である列に以下の XML データがあります。この例を使用してそれを行いました。

XML データ

<?xml version="1.0" encoding="utf-8"?>
<CarParkDataImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.transportdirect.info/carparking B:/CODE/carparks/CarParking.xsd" xmlns="http://www.transportdirect.info/carparking">
<CarPark>
    <CarParkRef>3</CarParkRef>
    <CarParkName>Nunnery Lane</CarParkName>
    <Location>York</Location>
    <Address>Nunnery Lane--York--North Yorkshire</Address>
    <Postcode>YO23 1AA</Postcode>
    <Telephone>01904551309</Telephone>
    <MinCostPence>200</MinCostPence>
    <IsParkAndRide>false</IsParkAndRide>
    <StayType>Short</StayType>
  </CarPark>
</CarParkDataImport>

私はこのクエリから始めました

select car.ref as car_ref
  , car.loc as car_loc
 from XML_DOCUMENTS
    , xmltable('/CarParkDataImport/CarPark'  
           passing XML_DOCUMENTS.XMLDOC
           columns 
              "ref"  varchar2(30) path 'CarParkRef'
              , "loc"  varchar2(30) path 'Location'
          ) car

しかし、私はエラーメッセージを受け取ります、

 ORA-00932: inconsistent datatypes: expected - got CLOB
 00932. 00000 -  "inconsistent datatypes: expected %s got %s"
 *Cause:    
 *Action:
 Error at Line: 5 Column: 24

その列がXMLTYPE列であることを期待しているので、この列を使用してテーブルを作成し、そこにXMLを挿入しようとしましたが、列はすべて(XMLTYPE)でした。これを機能させるには、スキーマを登録する必要があると思います、しかし登録スキーマは有効なxmlではないことを訴えたので、あきらめてCLOBに戻りました。

抽出値を使用した 2 番目のクエリは機能しているようですが、null が返されます

SELECT EXTRACTVALUE(xmltype(xmldoc), '/CarParkDataImport/CarPark/Location')
FROM xml_documents;

XMLDOC 列に 9 行あり、9 行が見つかりましたが、すべて null と表示されます。次に、以下のように提案された別の解決策を試しました

with src as (select xmltype(to_clob(XMLDOC)) /*)*/ AS messagetext FROM   xml_documents)
select car.REF as car_ref
   , car.LOC as car_loc
from src s
  , xmltable('/CarParkDataImport/CarPark'  
           passing S.messagetext
           columns 
              "REF"  varchar2(30) path 'CarParkRef'
              , "LOC"  varchar2(30) path 'Location'
          ) car
    ;

これは、実行された場合と同じ効果があるように見えますが、何も戻りません。

私は何が欠けていますか?名前空間を宣言する必要がありますか? パスがおかしくなっていますか、それとも XMLTYPE 列へのロードに戻る必要がありますか?

4

1 に答える 1

2

xmltabeは xmltype データを想定しています。したがって、CLOB を xmltype に変換します。また、xml 名前空間を宣言する必要があります。

SQL> create table xml_documents(
xmldoc clob
);

Table created.

SQL> insert into xml_documents values(
'<?xml version="1.0" encoding="utf-8"?>
<CarParkDataImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.transportdirect.info/carparking B:/CODE/carparks/CarParking.xsd" xmlns="http://www.transportdirect.info/carparking">
<CarPark>
    <CarParkRef>3</CarParkRef>
    <CarParkName>Nunnery Lane</CarParkName>
    <Location>York</Location>
    <Address>Nunnery Lane--York--North Yorkshire</Address>
    <Postcode>YO23 1AA</Postcode>
    <Telephone>01904551309</Telephone>
    <MinCostPence>200</MinCostPence>
    <IsParkAndRide>false</IsParkAndRide>
    <StayType>Short</StayType>
  </CarPark>
</CarParkDataImport>'
);

commit;

1 row created.
Commit complete.

SQL> select car.ref as car_ref
  , car.loc as car_loc
 from xml_documents
    , xmltable(xmlnamespaces(default 'http://www.transportdirect.info/carparking'),'CarParkDataImport/CarPark'  
           passing xmltype(xml_documents.xmldoc)
           columns 
               ref  varchar2(30) path 'CarParkRef'
              ,loc  varchar2(30) path 'Location'
          ) car;

CAR_REF                        CAR_LOC
------------------------------ ------------------------------
3                              York
于 2015-04-17T04:18:31.497 に答える