Цитат:
Опитах се да използвам това изявление по-долу, за да намеря подходяща колона въз основа на това, което смятам, че трябва да бъде наречена, но не даде резултати.*
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'
...
;