образец данных столбца:
Failure on table TOLL_USR_TRXN_HISTORY:
Failure on table DOCUMENT_IMAGES:
Error in CREATE_ACC_STATEMENT() [line 16]
Я ищу способ извлекать только слова в верхнем регистре (имена таблиц), разделенные подчеркиванием. Мне нужно полное имя таблицы, максимум 3 символа подчеркивания и минимум 1 знак подчеркивания. Я хотел бы игнорировать заглавные буквы initcap.


Вы можете использовать такой оператор SQL Select для каждой заменяемой отдельной строки
(Failure on table TOLL_USR_TRXN_HISTORY в приведенном ниже случае)
из вашего текста:
select regexp_replace(q.word, '[^a-zA-Z0-9_]+', '') as word
from
(
select substr(str,nvl(lag(spc) over (order by lvl),1)+1*sign(lvl-1),
abs(decode(spc,0,length(str),spc)-nvl(lag(spc) over (order by lvl),1))) word,
nvl(lag(spc) over (order by lvl),1) lg
from
(
with tab as
( select 'Failure on table TOLL_USR_TRXN_HISTORY' str from dual )
select instr(str,' ',1,level) spc, str, level lvl
from tab
connect by level <= 10
)
) q
where lg > 0
and upper(regexp_replace(q.word, '[^a-zA-Z0-9_]+', ''))
= regexp_replace(q.word, '[^a-zA-Z0-9_]+', '')
and ( nvl(length(regexp_substr(q.word,'_',1,1)),0)
+ nvl(length(regexp_substr(q.word,'_',1,2)),0)
+ nvl(length(regexp_substr(q.word,'_',1,3)),0)) > 0
and nvl(length(regexp_substr(q.word,'_',1,4)),0) = 0;
Альтернативный способ получить только имя таблицы из сообщения об ошибке ниже, приведенный ниже запрос будет работать, только если table_name в конце указанным способом
with t as( select 'Failure on table TOLL_USR_TRXN_HISTORY:' as data from dual)
SELECT RTRIM(substr(data,instr(data,' ',-1)+1),':') from t
Новый запрос для всех сообщений:
select replace (replace ( 'Failure on table TOLL_USR_TRXN_HISTORY:
Failure on table DOCUMENT_IMAGES:' , 'Failure on table', ' ' ),':',' ') from dual
что, если строка - «Ошибка в таблице TOLL_USR_TRXN_HISTORY TOLL_USR_TRXN_HISTORY2:» ..? Затем возвращает только TOLL_USR_TRXN_HISTORY2. И нет фильтра для всех прописных букв и подчеркиваний. И возвращает только последнее слово предложения.
Да, Барбаро ... это не сработает. Это выберет только последнее слово
Я обновил запрос для обработки нескольких сообщений ... поскольку сообщения об ошибках являются обычным явлением, я пошел с этим запросом .... но я вижу, что ваш запрос был потрясающим, каким бы он ни был :-)
Вы можете просто использовать regexp_substr():
select regexp_substr(str, '[A-Z_]{3,}', 1, 1, 'c')
from (select 'Failure on table TOLL_USR_TRXN_HISTORY' as str from dual) x;
В шаблоне говорится, что нужно найти подстроки с заглавными буквами или символами подчеркивания длиной не менее 3 символов. 1, 1 означает начало с первой позиции и возврат первого совпадения. 'c' делает поиск чувствительным к регистру.
Спасибо, это именно то, что я хочу.
Следует ли извлекать CREATE_ACC_STATEMENT с вашими данными?