인용문:
이름을 지정해야한다고 생각하는 항목에 따라 적절한 열을 찾기 위해 아래의이 문을 사용해 보았지만 결과가 반환되지 않았습니다. *
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 쿼리를 생성하는 한 가지 방법을 제공합니다. PL / SQL 블록 및 동적 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'
...
;