我有一个表,其中一列作为XMLTYPE与Object-Relational存储一起存储。下面是表格ddl。
CREATE TABLE Orders ( Order_id number not null,
Order_status Varchar2(100),
Order_desc XMLType not null )
XMLTYPE Order_desc STORE AS OBJECT RELATIONAL
XMLSCHEMA "http://localhost/public/xsd/Orderstore.xsd"
ELEMENT "OrderVal";
我已成功注册架构以使用XML DB加载XSD。下面是加载到XMLTYPE列中的XML。
<?xml version="1.0" encoding="utf-8" ?>
<draftorders>
<OrderSumm>
<Ordercod>OrderBookings</Ordercod>
</OrderSumm>
<Orderattrs>
<Orderattr Ordername="HROrder">
<OrderVals>
<OrderVal>
<listvalue>Order1</listvalue>
<Orderattrs>
<Orderattr Ordername="Node1_Child1">
<OrderVals>
<OrderVal>
<listvalue><![CDATA[ Node1_Child1_OrderValue_1]]></listvalue>
<Orderattrs>
<Orderattr Ordername="Node2_Child1">
<OrderVals>
<OrderVal>
<listvalue><![CDATA[ Node2_Child1_OrderValue_1]]></listvalue>
</OrderVal>
</OrderVals>
</Orderattr>
<Orderattr Ordername="Node2_Child2">
<OrderVals>
<OrderVal>
<listvalue><![CDATA[ Node2_Child2_OrderValue_1]]></listvalue>
</OrderVal>
</OrderVals>
</Orderattr>
</Orderattrs>
</OrderVal>
</OrderVals>
</Orderattr>
</Orderattrs>
</OrderVal>
</OrderVals>
</Orderattr>
</Orderattrs>
</draftorders>
此XML包含大约2500个Node2 Orderattr值。使用以下查询使用XMLTABLE一次性打印出所有Node2值。
SELECT ord.OrdName, ord.OrdVal
FROM Orders, XMLTable('/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr'
PASSING Order_desc
COLUMNS "OrdName" VARCHAR2(4000) PATH '@Ordername',
"OrdVal" VARCHAR2(4000) PATH 'OrderVals/OrderVal[1]/listvalue') ord;
输出: -
Node2_Child1
Node2_Child1_OrderValue_1
Node2_Child2
Node2_Child2_OrderValue_1
......
Node2_Child2500
Node2_Child2500_OrderValue_1
现在我想将结果集限制为仅前25个Node2 Orderattr值,而不是整个集合。我应该如何将结果集限制为仅前25个节点值。
能够使用XMLTable获取它。
我已尝试过以下XMLQuery函数来实现相同的上述输出,但接收截断的输出。
SELECT XMLQuery( '/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr/(@listname, OrderVals/OrderVal/listvalue/text())'
PASSING o.Order_desc RETURNING CONTENT)
FROM Orders o;
输出: - Node2_Child1Node2_Child1_OrderValue_1Node2_Child2Node2_Child2_OrderValue_1Node2_Child3Node2_Child3_OrderValue_1Node2_Child4Node2_Child4_OrderValue_1Node2_Child5Node2_Child5_OrderValue_1 ........ Node2_Child25Node2_Child25_OrderValue_1
...谢谢
答案 0 :(得分:1)
您需要在XQuery表达式的末尾添加一个带有position()
Xpath函数的条件:
...
XMLTable(
'/OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[position() <= 25]'
...
SQLFiddle test with your exapmle
<强>更新强>
问题已更新,所以更多关于XMLQuery()
功能。
首先,此函数返回单个XMLType,因此要获取您需要使用ExtractValue()
函数的单个元素:
with params as (
select XMLParse(content '
<draftorders>
<!-- EXAMPLE XML FROM QUESTION GOES HERE -->
</draftorders>
')
doc from dual
)
select
ExtractValue(xml_val, '/Orderattr/@Ordername') order_name,
ExtractValue(xml_val, '/Orderattr/OrderVals/OrderVal[1]/listvalue') list_value
from (
SELECT
XMLQuery(
'//OrderVal[1]/Orderattrs/Orderattr[1]/OrderVals/OrderVal[1]/Orderattrs/Orderattr[position() < 2]'
PASSING doc returning content
) xml_val
from
params
);
SQLFiddle test for XMLQuery variant
第二:如果您的XQuery返回节点集,那么由于没有单根节点,因此生成的XML格式不正确。
Last:在您的XMLQuery表达式中,返回值集,而不是XML。 XQuery中的所有值序列在没有分隔符的情况下连接在一起,因此您获得了所需的内容:
Node2_Child1<![CDATA[ Node2_Child1_OrderValue_1]]>Node2_Child2<![CDATA[ Node2_Child2_OrderValue_1]]>
并且在评估之后,这个表达式被翻译为
Node2_Child1Node2_Child1_OrderValue_1Node2_Child2Node2_Child2_OrderValue_1
哎呀...您错误输入了@Ordername
,并且至少在问题文本中将其更改为@listname
,因此此部分返回空字符串,如果此表达式未经更改而评估,结果将类似于
Node2_Child1_OrderValue_1Node2_Child2_OrderValue_1