Я стремлюсь сделать это, написав запрос, используя user_tables
Просмотр метаинформации и впервые выделив текст, который на самом деле является запросом sql:
SELECT 'select '''||TABLE_NAME||''', count(*) from '||TABLE_NAME||'union all' FROM USER_TABLES
Запуск этого в вашем инструменте запроса приведет ксетка строк, которые на самом деле являются sql-запросами сами по себе.Копирование их из таблицы результатов, вставка их в окно запроса (удаление завершающего UNION ALL) и повторный запуск их приводят к получению данных для каждой таблицы
select 'a', count(*) from a union all
select 'b', count(*) from b union all ....
Чтобы получить больше информации и включить имена столбцов, естьUSER_TAB_COLUMNS представление, которое цитирует информацию о столбцах (например, вы можете написать запрос, который генерирует запросы, которые ищут во всех столбцах varchar определенное значение)
Если вы действительно вовлечены, может быть более чистым использовать заполнители в строке и REPLACEони:
SELECT REPLACE(REPLACE(REPLACE(
'select ''{o}.{t}'' as tname, ''{c}'' as cname
from {o}.{t} where
{c} like ''hello%'' or
{c} like ''goodbye%'' union all'
--to add more placeholders copy paste these lines
--and ensure there is the same number of REPLACE
--as there are numbers of lines
, '{t}', TABLE_NAME)
, '{c}', COLUMN_NAME)
, '{o}', OWNER)
FROM ALL_TAB_COLUMNS
WHERE DATA_TYPE = 'VARCHAR'
Это намного чище, чем запуск и остановка вашей струны все время с помощью ||конкатенации.Я намеренно прописал прописными буквами внешний запрос и прописными буквами внутренний запрос, чтобы вы могли определить, какая часть является какой
Чтобы добавить больше заполнителей, поместите дополнительный REPLACE (вверху и скопируйте и вставьте вместо строк, начинающихся сзапятая. Пример копирования , '{t}', table_name)
вставьте и измените на , '{d}', data_type)
добавьте еще один REPLACE(
вверху, и теперь у вас есть заполнитель {d}, который можно использовать в любом месте первой строки (шаблон запроса sql) для обозначения данныхтип