#oracle #plsql #oracle-sqldeveloper
#Oracle #plsql #oracle-sqldeveloper
Вопрос:
Возможно ли найти конкретные данные из всей схемы в sql developer. Мой поиск должен быть похож на опцию «Найти объект базы данных» в sql developer.
Комментарии:
1. Вы хотите найти скалярное значение в каждой строке каждой применимой таблицы в схеме?
2. @JeffHolt Да..
Ответ №1:
Возможно ли это? Конечно. Но это будет ужасно дорого в чем-либо, кроме игрушечной схемы.
Скорее всего, вам нужно будет использовать динамический SQL (вероятно, вы могли бы выполнить то же самое с помощью XML-запроса). Упрощенная реализация будет делать что-то вроде
DECLARE
l_search_string varchar2(1000) := 'foo';
l_sql varchar2(4000);
l_cnt integer;
BEGIN
for c in (select *
from user_tab_columns
where data_type in ('CHAR', 'VARCHAR2'))
loop
l_sql := 'SELECT COUNT(*) FROM ' || c.table_name ||
' WHERE ' || c.column_name || ' = :1 ';
EXECUTE IMMEDIATE l_sql
INTO l_cnt
USING l_search_string;
IF( l_cnt > 0 )
THEN
dbms_output.put_line( l_search_string || ' found in column ' ||
c.column_name || ' in table ' ||
c.table_name );
END IF;
end loop;
END;
Вы могли бы сделать это более эффективным, создав один COUNT
запрос для каждой таблицы, а не для каждого столбца, но это будет более сложным для построения. Вы могли бы выполнить аналогичный процесс для a l_search_number
или a l_search_date
для поиска числовых столбцов или столбцов даты. Вы могли бы сделать код более надежным, обрабатывая имена таблиц или столбцов с учетом регистра (здесь я избегаю двойных кавычек для простоты). И вы можете сделать что-то более полезное, чем запись результата в dbms_output
.
Однако с точки зрения производительности вам придется читать практически каждую строку в каждой таблице базы данных, чтобы сделать это, что будет чрезвычайно медленно в большинстве реальных систем. Как правило, это также то, что не имеет особого смысла хотеть делать. Например, если вы ищете определенную строку, которая, как вы знаете, является именем человека, если ваша схема не разработана совершенно ужасно, вы почти наверняка можете просмотреть схему и определить несколько таблиц и столбцов, которые могут содержать имя человека. Не имеет смысла искать каждый столбец в каждой таблице на случай, если кто-то хранит имена в model
столбце car
таблицы.