Цитата:
Я пытался использовать это утверждение ниже
найти соответствующий столбец на основе
что я думаю, что это должно быть названо, но это
не дал результатов. *
SELECT * from dba_objects WHERE
object_name like '%DTN%'
Столбец не является объектом. Если вы имеете в виду, что вы ожидаете, что имя столбца будет похоже на «% DTN%», вам нужен следующий запрос:
SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';
Но если строка 'DTN' является лишь предположением с вашей стороны, это, вероятно, не поможет.
Кстати, насколько вы уверены, что «1/22 / 2008P09RR8» является значением, выбранным непосредственно из одного столбца? Если вы вообще не знаете, откуда он берется, это может быть конкатенация нескольких столбцов, или результат какой-либо функции, или значение, содержащееся во вложенном табличном объекте. Так что вы можете быть в погоне за диким гусем, пытаясь проверить каждый столбец на это значение. Не можете ли вы начать с того, какое клиентское приложение отображает это значение, и попытаться выяснить, какой запрос оно использует для его получения?
В любом случае, ответ diciu дает один метод генерации SQL-запросов для проверки значения в каждом столбце каждой таблицы. Вы также можете делать подобные вещи полностью в одном сеансе SQL, используя блок PL / SQL и динамический SQL. Вот какой-то поспешно написанный код для этого:
SET SERVEROUTPUT ON SIZE 100000
DECLARE
match_count INTEGER;
BEGIN
FOR t IN (SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE owner <> 'SYS' and data_type LIKE '%CHAR%') LOOP
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name ||
' WHERE '||t.column_name||' = :1'
INTO match_count
USING '1/22/2008P09RR8';
IF match_count > 0 THEN
dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
END IF;
END LOOP;
END;
/
Есть несколько способов сделать его более эффективным.
В этом случае, учитывая искомое значение, вы можете четко исключить любой столбец типа NUMBER или DATE, что уменьшит количество запросов. Может быть, даже ограничить его столбцами, где тип похож на «% CHAR%».
Вместо одного запроса на столбец, вы можете построить один запрос на таблицу, например:
SELECT * FROM table1
WHERE column1 = 'value'
OR column2 = 'value'
OR column3 = 'value'
...
;