Как я могу проанализировать несколько имен файлов из xml-файла с помощью regex_substr

#regex #substr #db2-400

Вопрос:

У меня есть журнал FTP в формате XML, хранящийся в столбце CLOB, и мне нужно получить имена файлов, которые он нашел и извлек. Используя Table/Lateral вместе с REGEX_SUBSTR, я могу получить то, что мне нужно для файлов с ИЗВЕСТНЫМ количеством, но я не могу понять, как обрабатывать неизвестное количество файлов. Существует поле, которое возвращает количество найденных файлов lt;FilesProcessedgt;3lt;/FilesProcessedgt; . Есть ли способ использовать это поле для анализа имен файлов? или , что более важно, есть ли просто лучший способ сделать это?

(Я использую CTE здесь, но я вытащу это из таблицы БД (с неприличным количеством столбцов, но без имен файлов!).

 With PAYLOAD_DATA(LOGS) as( VALUES ('lt;?xml version="1.0"?gt; lt;InboundMFTEventDetailsDocumentgt;  lt;MFTEventExecutionDetailsgt;  lt;Statusgt;Successfullt;/Statusgt;  lt;FilesProcessedgt;3lt;/FilesProcessedgt;  lt;MFTEventLogIDgt;5dn39m00fgmdefo80002g7kilt;/MFTEventLogIDgt;  lt;ExecutionLogsgt;  lt;Logsgt;Finding file(s) in VFS Path:/Wholesale/CS/Inbound/SFTP/PROD-OUT-Shipment/, URL:SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/.   Filename Filter = INVPTH*.txt  Found following 3 file(s).  SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt  SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320009986.txt  SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH092720210320009986.txt  lt;/Logsgt;  lt;Logsgt;Starting copy of file(s) from VFS Path:/Wholesale/CS/Inbound/SFTP/PROD-OUT-Shipment/, URL:SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt to VFS Path:/Wholesale/RLM/Outbound/SFTP/SERVERSERVICES-INBOUND-SHIPH/, URL:SFTP://MKWHLDV.kors.local:22/SERVERSERVICES/INBOUND/SHIPH/INVPTH033020210320006396.txt Copy finished:VFS Path:/Wholesale/CS/Inbound/SFTP/PROD-OUT-Shipment/, URL:SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt lt;/Logsgt;  lt;Logsgt;...lt;/Logsgt;  lt;Logsgt;...lt;/Logsgt;  lt;Logsgt;...lt;/Logsgt;  lt;/ExecutionLogsgt;  lt;/MFTEventExecutionDetailsgt; lt;/InboundMFTEventDetailsDocumentgt;'))  SELECT FILENAME FROM PAYLOAD_DATA A, TABLE (VALUES (REGEXP_SUBSTR(LOGS, ' SFTP://.*[rn][ |lt;]', 1, REGEXP_COUNT(LOGS, ' SFTP://.*[rn][ |lt;]') - 0)),  (REGEXP_SUBSTR(LOGS, ' SFTP://.*[rn][ |lt;]', 1, REGEXP_COUNT(LOGS, ' SFTP://.*[rn][ |lt;]') - 1)),  (REGEXP_SUBSTR(LOGS, ' SFTP://.*[rn][ |lt;]', 1, REGEXP_COUNT(LOGS, ' SFTP://.*[rn][ |lt;]') - 2)),  (REGEXP_SUBSTR(LOGS, ' SFTP://.*[rn][ |lt;]', 1, REGEXP_COUNT(LOGS, ' SFTP://.*[rn][ |lt;]') - 3))) as G(FILENAME)  
 SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH092720210320009986.txt  SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320009986.txt  SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt  

Комментарии:

1. Пожалуйста, добавьте тег базы данных, которую вы используете, в свой вопрос.

Ответ №1:

Может быть, что-то вроде

 With PAYLOAD_DATA(LOGS) as( ... ) occurrences (occ) as (values 1 union all select occ   1 from occurrences where occ lt; (SELECT REGEXP_COUNT(LOGS, ' SFTP://.*[rn][ |lt;]') FROM PAYLOAD_DATA)) select REGEXP_SUBSTR(LOGS, ' (SFTP://.*)[rn][ |lt;]', 1, occ, '', 1) filename from PAYLOAD_DATA, occurrences  

Комментарии:

1. Идеально!!! Как раз то, что мне было нужно.