Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将XPath与Oracle XMLTable中的变量一起使用?_Oracle_Xpath_Plsql - Fatal编程技术网

如何将XPath与Oracle XMLTable中的变量一起使用?

如何将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块中定义的,那么

如何将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块中定义的,那么请改用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子句的要点。