Quote:
Я попытался использовать этот оператор ниже, чтобы найти соответствующий столбец на основе того, что, по моему мнению, следует назвать, но он не дал результатов. *
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'
...
;