Я получаю разные версии файла 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')
- person Popeye   schedule 15.09.2019sstmt := 'SELECT ... INTO :sXMLVersion FROM ...'
, это неправильно, должно бытьsstmt := 'SELECT ... FROM ...'; execute immediate sstmt INTO sXMLVersion
- person Wernfried Domscheit   schedule 15.09.2019