2016-01-21 88 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()參數中指定多個變量來訪問更多節點並在單個查詢中處理它。