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。

使用提取值的第二个查询似乎有效,但带回了空值

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

我在 XMLDOC 列中有 9 行,它指出找到了 9 行,但全部为空。然后我尝试了以下建议的另一种解决方案

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 回答