【发布时间】:2016-08-29 17:46:00
【问题描述】:
我有一个XML 存储在表HOLDS_XML 中,列类型为XML_TYPE
<?xml version="1.0" encoding="UTF-8"?>
<cus:request xsi:schemaLocation="http://www.bt.com/btgs/solutions/message/customerRequest C:\SalesSchema_Latest\RequestManagementV1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sortarg="http://www.bt.com/btgs/solutions/library/SourceAndTarget" xmlns:siteType="http://www.bt.com/btgs/solutions/library/SiteType" xmlns:reqType="http://www.bt.com/btgs/solutions/library/RequestType" xmlns:prodType="http://www.bt.com/btgs/solutions/library/ProductType" xmlns:orgType="http://www.bt.com/btgs/solutions/library/OrganisationType" xmlns:ordType="http://www.bt.com/btgs/solutions/library/OrderType" xmlns:flexattType="http://www.bt.com/btgs/solutions/library/FlexattType" xmlns:contractType="http://www.bt.com/btgs/solutions/library/ContractType" xmlns:contactType="http://www.bt.com/btgs/solutions/library/ContractType" xmlns:addType="http://www.bt.com/btgs/solutions/library/AddressType" xmlns:cr="http://www.bt.com/btgs/solutions/message/customerRequest" xmlns:cus="http://www.bt.com/btgs/solutions/message/customerRequest" xmlns:prod="http://www.bt.com/btgs/solutions/library/ProductType">
<sourceSystem name="Resign Tool" type="LQTWebsite"/>
<targetSystem name="MESSIA" type="Sales Tools"/>
<changeRequest customerRequestRef="" BTProjectManagementRef="">
<billOfMaterials>
<bomSiteItem siteID="ID000009" siteInternalID="1163642" BTSiteType="host">
<organisation>
<organisationRef>ID000003</organisationRef>
</organisation>
<siteContact>
<role/>
<firstName/>
<lastName/>
<telephone/>
<mobile/>
<fax/>
<email/>
</siteContact>
<siteName>BIRMINGHAM_001</siteName>
<siteReference>ID000009</siteReference>
<siteAddress>
<room/>
<floor/>
<building>BT BUILDING</building>
<streetNumber>5</streetNumber>
<streetName>BRINDLEY PLACE</streetName>
<locality>BIRMINGHAM</locality>
<city>BIRMINGHAM</city>
<county-state>WEST MIDLANDS</county-state>
<country ISOCountryCode="">UNITED KINGDOM</country>
<postcode>B1 2BL</postcode>
</siteAddress>
<coordinates gridSystem="easting-and-northing">
<x-coordinate/>
<y-coordinate/>
</coordinates>
<installationLocation locID="ID000010">
<subPremise>FLOOR 3 ROOM 6</subPremise>
</installationLocation>
</bomSiteItem>
<bomSiteItem siteID="ID000167" siteInternalID="1163644" BTSiteType="client">
<organisation>
<organisationRef>ID000003</organisationRef>
</organisation>
<siteContact>
<role/>
<firstName/>
<lastName/>
<telephone/>
<mobile/>
<fax/>
<email/>
</siteContact>
<siteName>BIRMINGHAM_002</siteName>
<siteReference>ID000167</siteReference>
<siteAddress>
<room/>
<floor/>
<building>BT BUILDING</building>
<streetNumber>5</streetNumber>
<streetName>BRINDLEY PLACE</streetName>
<locality>BIRMINGHAM</locality>
<city>BIRMINGHAM</city>
<county-state>WEST MIDLANDS</county-state>
<country ISOCountryCode="">UNITED KINGDOM</country>
<postcode>B1 2BL</postcode>
</siteAddress>
<coordinates gridSystem="easting-and-northing">
<x-coordinate/>
<y-coordinate/>
</coordinates>
<installationLocation locID="ID000168">
<subPremise>FLOOR 3 ROOM 9</subPremise>
</installationLocation>
</bomSiteItem>
<bomSiteItem siteID="ID000208" siteInternalID="1163645" BTSiteType="client">
<organisation>
<organisationRef>ID000003</organisationRef>
</organisation>
<siteContact>
<role/>
<firstName/>
<lastName/>
<telephone/>
<mobile/>
<fax/>
<email/>
</siteContact>
<siteName>BIRMINGHAM_003</siteName>
<siteReference>ID000208</siteReference>
<siteAddress>
<room/>
<floor/>
<building>BT BUILDING</building>
<streetNumber>5</streetNumber>
<streetName>BRINDLEY PLACE</streetName>
<locality>BIRMINGHAM</locality>
<city>BIRMINGHAM</city>
<county-state>WEST MIDLANDS</county-state>
<country ISOCountryCode="">UNITED KINGDOM</country>
<postcode>B1 2BL</postcode>
</siteAddress>
<coordinates gridSystem="easting-and-northing">
<x-coordinate/>
<y-coordinate/>
</coordinates>
<installationLocation locID="ID000209">
<subPremise>FLOOR 6 ROOM 9</subPremise>
</installationLocation>
</bomSiteItem>
</billOfMaterials>
我必须读取存储在表XML_MASTER 中的xpath,从xml 中提取值并将其插入到另一个表中。存储Xpath的表结构是这样的
XPATH NODENAME FIELDNAME
changeRequest/billOfMaterials/bomSiteItem/siteAddress/streetName streetName Site_Address_streetname
changeRequest/billOfMaterials/bomSiteItem/siteContact/telephone telephone Site_Address_telephone
changeRequest/billOfMaterials/bomSiteItem/siteContact/email email Site_Addres_email
changeRequest/billOfMaterials/bomSiteItem/siteAddress/floor floor Site_Address_floor
changeRequest/billOfMaterials/bomSiteItem/siteAddress/room room Site_Address_room
changeRequest/billOfMaterials/bomSiteItem/siteAddress/county-state county-state Site_Address_country-state
changeRequest/billOfMaterials/bomSiteItem/siteContact/mobile mobile Site_Address_mobile
changeRequest/billOfMaterials/bomSiteItem/siteAddress/locality locality Site_Address_locality
changeRequest/billOfMaterials/bomSiteItem/siteContact/firstName firstName Site_Address_firstName
changeRequest/billOfMaterials/bomSiteItem/siteAddress/building building Site_Address_building
我已经创建了一个程序如下
create or replace
PROCEDURE Xml_parser
AS
TYPE cur_type IS ref CURSOR;
vxml XMLTYPE;
Vvalue Varchar2(100);
cur_string VARCHAR2(500);
vxpath xml_master.xpath%TYPE;
Vnodename xml_Master.Nodename%Type;
VFieldName xml_master.fieldname%TYPE;
select_cur CUR_TYPE;
verror VARCHAR2(500);
Cursor Cur_Xml_Master Is
select Xpath, Nodename, fieldname
from xml_master ;
BEGIN
SELECT xml_col
INTO vxml
FROM holds_xml;
dbms_output.Put_line ('inserted');
OPEN cur_xml_master;
Loop
FETCH cur_xml_master INTO vxpath, vnodename, vfieldname;
Exit When Cur_Xml_Master%Notfound ;
Cur_String := 'Select e."'
||Vnodename||
'" From Xmltable(''/'' '
|| 'Passing :xml columns "'
||Vnodename||
'" varchar2(200) path '''
||Vxpath||
''' )e';
dbms_output.Put_line (Cur_String);
OPEN select_cur FOR cur_string USING vxml;
dbms_output.Put_line ('after open');
LOOP
FETCH select_cur INTO vvalue;
EXIT WHEN select_cur%NOTFOUND;
dbms_output.Put_line (Cur_String);
dbms_output.Put_line ('value is: '|| vvalue);
END LOOP;
CLOSE select_cur;
END LOOP;
CLOSE cur_xml_master;
END;
但在运行此过程时出现错误
已插入 Select e.* From Xmltable('/' Passing :xml columns streetname varchar2(50) path 'changeRequest/billOfMaterials/bomSiteItem/siteAddress/streetName')e 打开后 错误:Xml_Parser -19279 - ORA-19279: XPTY0004 - XQuery 动态类型不匹配:预期的单例序列 - 得到多项序列
我想这是因为 XML 有多个 streetname 标签。读取所有值并将其插入某些变量的方法是什么。
【问题讨论】:
-
@J.Chomel 我不明白你在说什么?你想让我从哪里得到街道名称?
-
我现在没有 XSD。实际上,它是我在 Oracle 中转换的 MS 访问中的一个相当老的数据库。我没有关于 XML 的任何其他 XSD
-
我只是想从错误中猜测......当它只有一条记录时,你能加载文件吗? (删除其他
"billOfMaterials"记录,在您的输入中只留下一条)。