Вы можете создать вспомогательное представление, например:
CREATE OR REPLACE VIEW ALL_SURESH_TABLES AS
SELECT
table_name,
to_date(regexp_replace(table_name, 'SURESH_([[:digit:]]+)', '\1'), 'YYYYMMDD')
AS table_date
FROM
ALL_TABLES
WHERE
regexp_like(table_name, 'SURESH_[[:digit:]]+')
, а затем запросить его следующим образом:
SELECT
MAX(table_name) KEEP (DENSE_RANK LAST ORDER BY table_date)
FROM
ALL_SURESH_TABLES
WHERE
TRUNC(table_date, 'mm') = TRUNC(SYSDATE, 'mm')
(второй запрос не был подтвержден, но ондолжно быть прямым после создания представления ALL_SURESH_TABLES
)
Редактировать : В свете вашего комментария относительно ошибки "ORA-01830" я склонен полагать, что выхотя бы одна таблица, имя которой начинается с SURESH_
, заканчивается цифрами, но эти цифры не образуют действительную дату.Например, это приводит к возникновению той же ошибки:
/* Notice the "date" has nine digits instead of eight */
SELECT to_date('201012088', 'YYYYMMDD') FROM DUAL
Поэтому я рекомендую изменить это:
regexp_replace(table_name, 'SURESH_([[:digit:]]+)', '\1')
на следующее:
regexp_replace(table_name, 'SURESH_([[:digit:]]{8}).*', '\1')
измененное регулярное выражение будет обращать внимание только на первые восемь цифр после "SURESH_
".