2016-01-21 99 views
0

我想使用XMLTABLE读取XML,但我希望我的PATH是一个varchar2而不是字符串。我试图做到这一点,但我得到的错误“ORA-01780:字符串字面要求”Oracle:使用XMLTable读取XML

例子:

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; 

有谁知道,如果有任何的方式来使用一个VARCHAR2变量类型PATH直接写入路径之后?

+0

请检查问题文本中的路径:“人员”与“人员”和“员工”与“员工”... – ThinkJet

回答

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()参数中指定多个变量来访问更多节点并在单个查询中处理它。