Удаление кода HTML в Oracle SQL из значения CLOB ListAgg - PullRequest
0 голосов
/ 14 мая 2019

У меня есть некоторый код, который возвращает стандартные столбцы, но затем несколько столбцов, которые используют функцию Listagg, чтобы поместить несколько значений в 1 ячейку, а не иметь несколько строк.В столбце «Заметки» хранятся все заметки как «CLOB»

. Проблема заключается в том, что кто-то в организации сохраняет электронное письмо как заметку.Когда отчет запускается, он выводит содержимое электронной почты, заключенное в HTML-теги (и многие из них)

Я хотел удалить все HTML-теги из вывода, оставляя только чистый текст независимо от заметки или форматирования.

Если формат ячейки не был закрытым, этот бит кода работает нормально:

REGEXP_REPLACE(COLUMN_NAME,'\s*<[^>]*>\s*',NULL,1,0,'im')

, но он ничего не делает с выводом, который генерирует мой код.

Мой код, который работает с listagg и производит вывод CLOB:

Note_data_main AS(
SELECT DISTINCT
AI.INVOICE_ID,
AI.INVOICE_NUM,
note.*,
NULL AS ORG_ID,
NULL As Invoice_Date, 
NULL AS HOLD_REASON, 
NULL AS RELEASE_REASON, 
NULL AS Hold_Date, 
NULL AS VENDOR_NAME,  
NULL AS VENDOR_SITE_CODE,
NULL AS Due_Date,
NULL AS DAYS_OVERDUE,
NULL AS SEGMENT1,
NULL AS Days,
NULL AS Requisitioner,
NULL AS CreatedName,
NULL AS Overdue_Status

FROM
AP_INVOICES_ALL AI,
zmm_notes note
WHERE
AI.INVOICE_ID = note.SOURCE_OBJECT_UID(+)

),

JOINAGE AS (
SELECT A.*, DBMS_LOB.SUBSTR(B.NOTE_TXT,30000) AS Note
FROM INVOICE_DATA A
LEFT JOIN Note_data_main B
ON A.INVOICE_ID = B.SOURCE_OBJECT_UID
),
NOTEDEET AS (

SELECT INVOICE_ID,ORG_ID,INVOICE_NUM,INVOICE_DATE,
HOLD_REASON,VENDOR_NAME,VENDOR_SITE_CODE,
DUE_DATE,DAYS_OVERDUE,SEGMENT1,DAYS,REQUISITIONER,
CREATEDNAME,OVERDUE_STATUS,
rtrim(xmlagg(xmlelement(e, Note, (chr(10)||'--------------- 
'||chr(10)))).extract('//text()').getclobval(), (chr(10)||'--------------- 
'||chr(10))) AS Notes
FROM 
JOINAGE
GROUP BY 
INVOICE_ID,ORG_ID,INVOICE_NUM,INVOICE_DATE,HOLD_REASON,VENDOR_NAME,
VENDOR_SITE_CODE,DUE_DATE,DAYS_OVERDUE,SEGMENT1,DAYS,
REQUISITIONER,CREATEDNAME,OVERDUE_STATUS
ORDER BY INVOICE_ID
)

Ниже приведен текущий вывод и то, что я хочу достичь Текущий:

<p><font face="Times New Roman" size="3">

</font></p><p style="margin: 0cm 0cm 0pt;"><font 
face="Arial,Helvetica,sans-serif" size="3">Good
afternoon Inspector XXX</font></p><p><font face="Arial,Helvetica,sans- 
serif" size="3">

</font></p><p style="margin: 0cm 0cm 0pt;"><font 
face="Arial,Helvetica,sans-serif" size="3"><span style="color: rgb(31, 73, 
125);"><font face="Arial,Helvetica,sans-serif" size="3">We
have received the attached invoice for payment but unfortunately, we are 
unable
to make payment as there is not enough money on the purchase order for 
which
you are the requester.</font></span></font></p><p style="margin: 0cm 0cm 
0pt;"><font face="Arial,Helvetica,sans-serif" size="3"><span style="color: 
rgb(31, 73, 125);"><br/></span></font>

Ожидается:

"

Добрый день, инспектор XXX

Мы получили прилагаемый счет на оплату, но, к сожалению,мы не можем произвести оплату, так как на заказе на поставку недостаточно средств, для которого вы запрашиваете. "

Я понимаю, что создание функций справится с этой ситуацией, но я работаю в Oracle BI Cloud, поэтому я не могу вставлять и создавать таблицы и создавать какие-либо функции для последующего вызова.

Любая помощь очень ценится, и если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 14 мая 2019

С помощью Алекса Пула решение ранее поместило regex_replace в коде, чтобы оно непосредственно воздействовало на столбец

Это то, что я изменил:

JOINAGE AS (
SELECT A.*, regexp_replace(regexp_replace(DBMS_LOB.SUBSTR(B.NOTE_TXT,30000),'<.*?>'),'&nbsp') AS Note
FROM INVOICE_DATA A
LEFT JOIN Note_data_main B
ON A.INVOICE_ID = B.SOURCE_OBJECT_UID
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...