【问题标题】:Oracle: read XML using XMLTableOracle:使用 XMLTable 读取 XML
【发布时间】:2016-04-28 04:41:35
【问题描述】:

我想使用 XMLTABLE 读取 XML,但我希望我的 PATH 是 varchar2 而不是字符串。我正在尝试这样做,但我收到错误“ORA-01780: string literal required”

例子:

path1 VARCHAR2(100);
path2 VARCHAR2(100);
path3 VARCHAR2(100);
path4 VARCHAR2(100);

begin

path1 :='persons/employees/emp';
path2 :='persons/employees/name';
path3 :='persons/employees/job';
path4 :='persons/employees/hire';

SELECT xt.*
FROM   xml_tab x,
       XMLTABLE('/company/person'
         PASSING x.xml_data
         COLUMNS 
           "EMPNO"    VARCHAR2(4)  PATH path1,
           "ENAME"    VARCHAR2(10) PATH path2,
           "JOB"      VARCHAR2(9)  PATH path3,
           "HIREDATE" VARCHAR2(11) PATH path4
         ) xt;

有谁知道是否有任何方法可以在 PATH 之后使用 varchar2 变量类型而不是直接编写路径?

【问题讨论】:

  • 请检查问题文本中的路径:persons vs personemployees vs employee ...

标签: xml oracle oracle11g xml-parsing


【解决方案1】:

如果您需要使用动态路径从初始 XML 中检索节点值,只需使用 XQuery 参数和 XPath 中的name() 来构造固定的 XML 结构,而不管源 XML 结构如何:

declare

  vXML xmltype := xmltype('
    <company>
      <persons>
        <employee>
          <emp>emp-01</emp>
          <name>name-01</name>
          <job>job-01</job>
          <hire>hire-01</hire>
        </employee>
        <employee>
          <emp>emp-02</emp>
          <name>name-02</name>
          <job>job-02</job>
          <hire>hire-02</hire>
        </employee>
      </persons>
    </company>
  ');

  vXQueryText varchar2(4000) := '
    for $cur_emp in $doc/company/persons/employee
      return
        <result>
          <emp_name>{$cur_emp/*[name()=$node_path]}</emp_name>
        </result>
  ';

  vNodePath varchar2(4000);

  procedure print_node_values(pNodePath in varchar2)
  is
  begin

    dbms_output.put_line('--- Values of "'||pNodePath||'" node ---');

    for cTest in (
      select * 
      from 
        XMLTable(vXQueryText
          passing 
            vXML         as "doc",
            pNodePath as "node_path"
          columns
            emp_name varchar2(4000) path '/result/emp_name'
        )
    )
    loop
      dbms_output.put_line('emp_name: ' || cTest.emp_name);
    end loop;
  end;

begin

  print_node_values('name');
  print_node_values('job');

end;

此示例打印以下内容:

--- Values of "name" node ---
emp_name: name-01
emp_name: name-02
--- Values of "job" node ---
emp_name: job-01
emp_name: job-02

当然,您可以在XMLTable()参数中指定多个变量,以访问更多节点并在单个查询中处理。

【讨论】:

    猜你喜欢
    • 2020-04-29
    • 2014-08-14
    • 2019-02-16
    • 2017-12-06
    • 1970-01-01
    • 2019-07-22
    • 2012-03-08
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多