首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle:使用XMLTable读取XML

Oracle:使用XMLTable读取XML
EN

Stack Overflow用户
提问于 2016-01-22 03:01:42
回答 1查看 374关注 0票数 0

我希望使用XMLTABLE读取XML,但是我希望我的路径是一个varchar2而不是一个字符串。我正在尝试这样做,但收到错误消息"ORA-01780:需要字符串文字“

示例:

代码语言:javascript
复制
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变量类型?

EN

回答 1

Stack Overflow用户

发布于 2016-01-22 07:12:32

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

代码语言:javascript
复制
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;

此示例打印如下:

代码语言:javascript
复制
--- 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()参数中指定多个变量,以访问更多节点并在单个查询中处理它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34932174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档