【发布时间】:2015-09-04 00:10:15
【问题描述】:
我有这个问题:
SELECT TYPE, IDVIEW, ATTRIBUTE, VALUE
FROM XML_IMPORT_REPOSITORY t
CROSS JOIN XMLTABLE ('for $item in /SRDBSW/OBJ_DF[@IdView="ICU-ASW"]/*[@IdView]
for $item_attr in $item/@*
return element {$item/name(.)}
{
element idview {$item/@IdView/string()},
element attr {$item_attr/local-name(.)},
element value {$item_attr/string()}
}
' PASSING t.XMLDATA COLUMNS
TYPE VARCHAR2(30) PATH 'local-name(.)',
IDVIEW VARCHAR2(30) PATH 'idview',
attribute VARCHAR2(30) PATH 'attr',
value VARCHAR2(30) PATH 'value' ) x
我收到此错误:
ORA-19279:XPTY0004 - XQuery 动态类型不匹配:预期单例 序列 - 得到多项序列 19279. 00000 -“XPTY0004 - XQuery 动态类型不匹配:预期的单例序列 - 得到多项序列”
我发现了问题,问题是这一行:
element value {$item_attr/string()}
但找不到解决方法来获取属性的值...
xml 中的一个示例
<OBJ_DF IdView="ICU-ASW" CategoryFlag="0" OwnerFlag="0" ObjLevel="Element" IsDefined="Y" ShortDescription="CONFIG Major function" ShortDescriptionCore="CONFIG Major function" LongDescription="CONFIG Major function Manual Load" Mnemonic="CONFIG Major function">
<TEXTUAL_CURVE_DF IdView="0001" ShortDescription="PhysSide octet" ShortDescriptionCore="PhysSide octet" LongDescription="Type identifying the physical side of a unit in 8 bits" Mnemonic="Physical_Side_Octet_T" CategoryFlag="0" OwnerFlag="0" IsDirect="Y" Type="CURVE" CurveType="Textual" RawFormat="Unsigned Integer">
<DIG_POINT_LIST>
<DIG_POINT LowValue="0" StatusText="SIDE_1" Mnemonic="Side_1" Ldesc="FCI/Config/Physical_Side_Octet.Side_1" HighValue="0"/>
<DIG_POINT LowValue="1" StatusText="SIDE_2" Mnemonic="Side_2" Ldesc="FCI/Config/Physical_Side_Octet.Side_2" HighValue="1"/>
</DIG_POINT_LIST>
</TEXTUAL_CURVE_DF>
<TEXTUAL_CURVE_DF IdView="0002" ShortDescription="Health_T" ShortDescriptionCore="Health_T" LongDescription="Type for Health of unit or equipment" Mnemonic="Health_T" CategoryFlag="0" OwnerFlag="0" IsDirect="Y" Type="CURVE" CurveType="Textual" RawFormat="Unsigned Integer">
<DIG_POINT_LIST>
<DIG_POINT LowValue="0" StatusText="UNHEALTHY" Mnemonic="Unhealthy" Ldesc="FCI/Config/Health.Unhealthy" HighValue="0"/>
<DIG_POINT LowValue="1" StatusText="HEALTHY" Mnemonic="Healthy" Ldesc="FCI/Config/Health.Healthy" HighValue="1"/>
</DIG_POINT_LIST>
</TEXTUAL_CURVE_DF>
<TEXTUAL_CURVE_DF IdView="0003" ShortDescription="Logical_Power_T" ShortDescriptionCore="Logical_Power_T" LongDescription="Type for Logical On or Off status of unit or equipment" Mnemonic="Logical_Power_T" CategoryFlag="0" OwnerFlag="0" IsDirect="Y" Type="CURVE" CurveType="Textual" RawFormat="Unsigned Integer">
<DIG_POINT_LIST>
<DIG_POINT LowValue="0" StatusText="OFF" Mnemonic="Off" Ldesc="FCI/Config/Logical_Power.Off" HighValue="0"/>
<DIG_POINT LowValue="1" StatusText="ON" Mnemonic="On" Ldesc="FCI/Config/Logical_Power.On" HighValue="1"/>
</DIG_POINT_LIST>
</TEXTUAL_CURVE_DF>
</OBJ_DF>
查询应该返回项目的名称,所有都是属性
工作集是:
CREATE OR REPLACE directory XTDIR AS 'C:\Users\aadr\Documents\SCCOPEN\NEW-IMPORT\demo';
BEGIN
DBMS_XMLSCHEMA.registerSchema(
SCHEMAURL => 'http://www.w3.org/2001/XMLSchema',
SCHEMADOC => bfilename('XTDIR','SRDBSW_schema_full.xsd'));
END;
CREATE TABLE XML_IMPORT_REPOSITORY (xmlkey VARCHAR(20) PRIMARY KEY, xmlData XMLType)
xmltype column xmlData XMLSCHEMA "http://www.w3.org/2001/XMLSchema"
element "SRDBSW" tablespace USERS;
INSERT INTO XML_IMPORT_REPOSITORY(XMLKEY, XMLDATA) VALUES
('full',XMLType(bfilename('XTDIR', 'full.xml'), nls_charset_id('AL32UTF8')));
commit;
所有这些都不起作用,我这样做的原因是为了增加查询的性能,而这个查询对于大型 xmls 文件来说非常慢
【问题讨论】:
-
您能否添加一个生成错误的小示例 XML 文档?
-
它在 11.2.0.3 中对我来说很好用(带有封闭的 SRDBSW 标记)。你在什么版本下运行这个?
-
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
-
你可以试试
element value {$item_attr[1]/string()}- 即添加[1]吗? -
元素值 {$item_attr[1]/string()} ,同样的错误 ORA-19279: XPTY0004 - XQuery 动态类型不匹配:预期的单例序列 - 得到多项序列