如何将XPath与Oracle XMLTable中的变量一起使用?
如何将XPath与Oracle XMLTable中的“/abc/[contract=$count]/initialValue”这样的变量一起使用 例如:如何将XPath与Oracle XMLTable中的变量一起使用?,oracle,xpath,plsql,Oracle,Xpath,Plsql,如何将XPath与Oracle XMLTable中的“/abc/[contract=$count]/initialValue”这样的变量一起使用 例如: XMLTable('root/level1', PASSING xmlContent COLUMNS initial_value varchar2(100) PATH '/abc/[contract = $count]/initialValue' ) 如何替换/计算$count运行时?如果count变量是在外部pl/sql块中定义的,那么
XMLTable('root/level1', PASSING xmlContent
COLUMNS initial_value varchar2(100) PATH '/abc/[contract = $count]/initialValue'
)
如何替换/计算$count运行时?如果count变量是在外部pl/sql块中定义的,那么请改用table,因为xmltable路径必须是字符串文本,并且不允许在外部pl/sql块中拼接变量 我假设您的xml结构是
<root>
<level1>
<abc>
<contract>3</contract>
<initialValue>4</initialValue>
</abc>
</level1>
</root>
SQL> declare
2 v_count number := 3;
3 begin
4 for r_row in (select extractvalue(value(my_table), '/level1/abc[contract = "' || v_count || '"]/initialValue') xml
5 from table(
6 xmlsequence(
7 extract(XMLType('<root>
8 <level1>
9 <abc>
10 <contract>3</contract>
11 <initialValue>4</initialValue>
12 </abc>
13 </level1>
14 <level1>
15 <abc>
16 <contract>3</contract>
17 <initialValue>7</initialValue>
18 </abc>
19 </level1>
20 <level1>
21 <abc>
22 <contract>4</contract>
23 <initialValue>24</initialValue>
24 </abc>
25 </level1>
26 </root>'),
27 '/root/level1'))) my_table)
28 loop
29 dbms_output.put_line(r_row.xml);
30 end loop;
31 end;
32 /
4
7
使用xmltable的方法不是将其放入XPAth中,而是随后在where子句中进行筛选:
SQL> declare
2 v_count number := 3;
3 begin
4 for r_row in (select *
5 from XMLTable( 'root/level1' passing xmltype('<root>
6 <level1>
7 <abc>
8 <contract>3</contract>
9 <initialValue>4</initialValue>
10 </abc>
11 </level1>
12 <level1>
13 <abc>
14 <contract>3</contract>
15 <initialValue>7</initialValue>
16 </abc>
17 </level1>
18 <level1>
19 <abc>
20 <contract>4</contract>
21 <initialValue>24</initialValue>
22 </abc>
23 </level1>
24 </root>')
25 columns initial_value varchar2(100) PATH 'abc/initialValue',
26 contract varchar2(100) PATH 'abc/contract')
27 where contract = v_count)
28 loop
29 dbms_output.put_line(r_row.initial_value);
30 end loop;
31 end;
32 /
4
7
您可以传入变量,只需在passing子句中定义它们:
with table1 AS
(select xmltype(
'<abc>
<def>
<contract>1</contract>
<oper>SFO</oper>
<lmt>limit1</lmt>
</def>
<def>
<contract>2</contract>
<oper>boston</oper>
<lmt >limit2</lmt>
</def>
</abc>'
) xmlcol from dual
)
SELECT u.*
FROM table1
, XMLTable('/abc/def[contract = $count]'
PASSING xmlcol, 1 as "count"
COLUMNS contract integer path 'contract',
oper VARCHAR2(20) PATH 'oper' ) u
CONTRACT OPER
---------- --------------------
1 SFO
你在哪里设置$count?它是包含pl/sql块的变量吗?需要更多的上下文。您的xpath看起来也是错误的,所以请告诉我们它的结构是相同级别的contract+initialValue?假设这是一个动态XQuery,xpath有效性在这里并不重要。动态XQuey支持在运行时替换变量。例如:假设下面是从/abc/[contract=$count]/initialValue替换/生成的XQuery/abc/[contract=123]/initialValue。我希望在XMLTable中使用动态XQuery。不幸的是,Oracle文档说它不允许XML_传递_子句用于列。啊,谢谢。我在第一个参数中错过了我可以传递XML子句的要点。