我希望使用XMLTABLE读取XML,但是我希望我的路径是一个varchar2而不是一个字符串。我正在尝试这样做,但收到错误消息"ORA-01780:需要字符串文字“
示例:
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变量类型?
发布于 2016-01-22 07:12:32
如果需要使用动态路径从初始XML中检索节点值,只需使用XPath中的XQuery参数和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()参数中指定多个变量,以访问更多节点并在单个查询中处理它。
https://stackoverflow.com/questions/34932174
复制相似问题