【发布时间】:2020-01-16 10:44:09
【问题描述】:
我收到了不同版本的 xml 文件,每个文件都在不同的命名空间中定义。所以我需要在我的动态查询中使用命名空间作为绑定变量。
在 Oracle 12.1 上,该语句使用硬编码命名空间运行良好:XMLNAMESPACES (DEFAULT 'http://www.ff.org')。
如果我尝试用绑定变量替换字符串,则会由于缺少单引号而引发错误。我已经尝试在“立即执行”中绑定变量时添加单引号,或者在包含绑定变量 :sNamespace 的动态查询中添加引号,但它们都不起作用。
declare
sNamespace varchar2(100);
sXMLVersion VARCHAR2(3);
sstmt varchar2(1000);
begin
sNamespace := 'http://www.ff.org';
sstmt := q'#
with t_base as (select xmltype('<froot xmlns="http://www.ff.org">
</froot>') as xml from dual)
SELECT case when v.is_root = 1 then '1'
else '2' end
into :sXMLVersion
FROM t_base t,
XMLTABLE(XMLNAMESPACES(DEFAULT :sNamespace),
'$d' passing t.xml as "d"
columns
is_root INTEGER PATH 'exists(froot)'
) v
#';
execute immediate sstmt using sNamespace into sXMLVersion;
dbms_output.put_line(sXMLVersion);
end;
【问题讨论】:
-
将
XMLTABLE(XMLNAMESPACES(DEFAULT :sNamespace)更改为XMLTABLE(XMLNAMESPACES(DEFAULT ':sNamespace') -
不幸的是,这不是正确的解决方案,因为它现在抛出 ORA-01006 绑定变量不存在。请仅提供工作代码作为解决方案建议。
-
你的说法一大问题是
sstmt := 'SELECT ... INTO :sXMLVersion FROM ...',错了,一定是sstmt := 'SELECT ... FROM ...'; execute immediate sstmt INTO sXMLVersion
标签: sql oracle dynamic bind-variables