set term !! ;
execute block
returns (
table_name varchar(63),
column_name varchar(63),
sql_statement varchar(1000),
result_count integer)
as
declare search_value varchar(30) = 'Искомое_значение'; /* <--- ЗАМЕНИТЕ ЭТО */
declare has_result boolean;
declare search_sql varchar(1000);
begin
/* 1. Получаем список всех пользовательских таблиц и их колонок */
for select trim(r.rdb$relation_name), trim(f.rdb$field_name)
from rdb$relation_fields f
join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
where r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
order by r.rdb$relation_name, f.rdb$field_position
into :table_name, :column_name
do
begin
/* 2. Для каждой колонки динамически строим и выполняем проверочный запрос */
/* Используем CONTAINING для поиска подстроки без учета регистра */
search_sql = 'select exists(select * from "' || table_name || '" where upper("' || column_name || '") containing upper(?)) from rdb$database';
begin
execute statement search_sql (search_value)
into has_result;
/* 3. Если значение найдено, показываем результат */
if (has_result = true) then
begin
/* Формируем SQL для удобного просмотра данных */
sql_statement = 'select * from "' || table_name || '" where "' || column_name || '" containing ''' || search_value || '''';
result_count = 1;
suspend;
end
end
when any do
begin
/* Пропускаем колонки, где тип данных несовместим с поиском (например, числа, даты) */
end
end
end !!
set term ; !!