У меня есть таблица, содержащая в столбце clob такое значение: <root><node><a>text1a</a><b>text1b</b></node><node><a>text2a</a><b>text2b</b></node></root>
Используя PL/SQL, мне нужно запросить его и получить этот вывод в двух строках:
<node><a>text1a</a><b>text1b</b></node>
<node><a>text2a</a><b>text2b</b></node>
Это может быть больше 4000 символов каждый. Тег должен быть включен в вывод.
Исходные данные не в varchar; это в каком-то LOB. Если вы согласны с возвратом 2 больших объектов, найдите табличные функции PLSQL (чтобы поместить функцию в предложение from) и используйте пакет dbms_lob, возвращающий 2 строки, где каждая строка также является большим объектом.
Если вы хотите вернуть его как данные varchar, у вас есть ограничение в 4000. Все, что вы можете сделать, это вернуть несколько строк из 4000 и объединить их все в своем клиентском программном обеспечении.
Вы можете увидеть эту ссылку, где есть решение для разделения большого двоичного объекта на строки по 4000 байтов. https://medium.com/@thesaadahmad/a-blobs-journey-from-the-database-to-the-browser-98884261e137
Мне нужно вернуть кусочек. Я прочитал параметр суммы в DBMS_LOB.SUBSTR не может быть больше 32767. Хотя каждый узел у меня холодный, он должен быть длиннее. Я думаю, что RegExpr может решить, но я не уверен в этом.
У вас действительно есть только два варианта: а) использовать dbms_lob substr и преобразовать его обратно в lob и вернуть вашему клиенту. Ваш клиент должен быть в состоянии обработать это. Но если ваш клиент может это обработать, зачем вообще dbms_lob; просто верните большую строку и проанализируйте ее на клиенте. б) Возвращайте несколько строк из 4000 БД, каждая с порядковым номером. Теперь ваш клиент просто видит varchar, но ему нужно знать, что ему нужно прочитать несколько строк и объединить их на своей стороне. Ссылка предоставляет последний вариант.
Преобразуйте clob в xmltype и используйте xmltable для его анализа:
with s as (select '<root><node><a>text1a</a><b>text1b</b></node><node><a>text2a</a><b>text2b</b></node></root>' c from dual)
select x.node node_xml, x.node.getclobval() node_clob
from s,
xmltable(
'/root/node'
passing xmltype(s.c)
columns
node xmltype path '.'
) x;
NODE_XML NODE_CLOB
------------------------------------------ ------------------------------------------
<node><a>text1a</a><b>text1b</b></node> <node><a>text1a</a><b>text1b</b></node>
<node><a>text2a</a><b>text2b</b></node> <node><a>text2a</a><b>text2b</b></node>
Пакет dbms_lob — мне показалось, что я ссылался на него, а также на эту функцию plsql в предложении from. Я не собираюсь снова вырезать/вставлять сюда код. Иногда я задаюсь вопросом, получают ли люди деньги за "против"! В любом случае интересно видеть, что люди не читают ответы или вопросы, но настаивают на том, чтобы внести свой вклад. Где-то должно быть какое-то секретное собрание stackoverflow....