특정 값에 대해 모든 테이블의 모든 필드 검색 (Oracle)


115

Oracle의 특정 값에 대해 모든 테이블의 모든 필드를 검색 할 수 있습니까?

일부 테이블에는 수천 개의 행이있는 수백 개의 테이블이 있으므로 쿼리하는 데 시간이 오래 걸릴 수 있음을 알고 있습니다. 그러나 내가 아는 유일한 것은 내가 쿼리하려는 필드의 값이 1/22/2008P09RR8. <

이름을 지정해야한다고 생각하는 항목에 따라 적절한 열을 찾기 위해 아래의이 문을 사용해 보았지만 결과가 반환되지 않았습니다.

SELECT * from dba_objects 
WHERE object_name like '%DTN%'

이 데이터베이스에 대한 문서는 전혀 없으며이 필드가 어디에서 가져 오는지 전혀 모릅니다.

이견있는 사람?


저장 프로 시저를 사용하는 대신 단일 쿼리를 사용하여이 작업을 수행 할 수 있습니까?
Freakyuser


@LalitKumarB 귀하가 나열한 페이지는 더 이상 액세스 할 수 없습니다. 답변으로 일부 정보를 게시 할 수 있습니까?
Dodzi Dzakuma

@DodziDzakuma 페이지에 액세스 할 수 있습니다. lalitkumarb.wordpress.com/2015/01/06/… 또한 답변을 게시했습니다. 아래로 스크롤하거나 stackoverflow.com/a/27794127/3989608을
Lalit Kumar B

Lalit Kumar 쿼리를 파악하는 데 문제가있는 경우 다음 데모를 시도하십시오. sqlfiddle.com/#!4/76924c/2/0
DxTx

답변:


93

인용문:

이름을 지정해야한다고 생각하는 항목에 따라 적절한 열을 찾기 위해 아래의이 문을 사용해 보았지만 결과가 반환되지 않았습니다. *

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'
     ...
     ;

숫자 및 날짜 열에는 해당 문자열이 포함될 수 없으므로 char, varchar 및 varchar2 열로 제한해야합니다.
Erich Kitzmueller

8
@ammoQ-마지막에서 두 번째 단락에서 말한 것처럼?
Dave Costa

나는 이것을 9i에서 실행했고 column_name 알 수없는 오류가 발생합니다. 누군가 9i에서 이것을 실행하기 위해 어떤 수정이 필요한지 말해 줄 수 있습니까?
Regmi

@Regmi-죄송합니다. 실제로 버전 문제가 아닌 내 코드의 실수였습니다. 루프는 all_tab_columnsnot 에 의해 구동되어야합니다 all_tables. 나는 그것을 고쳤다.
Dave Costa

@DaveCosta-수정 해 주셔서 감사합니다.하지만 여전히 6 행에 '테이블 또는 뷰가 존재하지 않습니다'오류가 발생합니다. 6 행은 "즉시 실행"입니다.
Regmi

34

한 명의 소유자에서만 검색하는 경우 더 빠르게 작동하도록 위 코드를 수정했습니다. 검색하려는 항목에 맞게 v_owner, v_data_type 및 v_search_string 변수 3 개를 변경하기 만하면됩니다.

SET SERVEROUTPUT ON SIZE 100000

DECLARE
  match_count INTEGER;
-- Type the owner of the tables you are looking at
  v_owner VARCHAR2(255) :='ENTER_USERNAME_HERE';

-- Type the data type you are look at (in CAPITAL)
-- VARCHAR2, NUMBER, etc.
  v_data_type VARCHAR2(255) :='VARCHAR2';

-- Type the string you are looking at
  v_search_string VARCHAR2(4000) :='string to search here...';

BEGIN
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name||' WHERE '||t.column_name||' = :1'
    INTO match_count
    USING v_search_string;

    IF match_count > 0 THEN
      dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
    END IF;

  END LOOP;
END;
/

이 쿼리를 실행하려면 첫 번째 줄에 주석을 추가해야했습니다. 또한 소유자 필터를 제거하고 쿼리를 실행할 수 없습니다.
포파 안드레이

1
따옴표가 필요한 경우 문제를 피하기 위해 테이블 ​​이름 / 열 이름을 큰 따옴표로 묶어야했습니다.'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
Steve Chambers

all_tab_cols는 이름에도 불구하고 전망이 포함되어 있는지 조심
phil_w

정확히 무엇 dbms_output입니까? 쿼리가 DataGrip에서 성공적으로 실행되기 때문에 결과가 표시되지 않습니다.
misteeque

나는 이것이 조금 오래
되었다는

7

다음은 하위 문자열 일치를 비교할 또 다른 수정 된 버전입니다. 이것은 Oracle 11g에서 작동합니다.

DECLARE
  match_count INTEGER;
-- Type the owner of the tables you are looking at
  v_owner VARCHAR2(255) :='OWNER_NAME';

-- Type the data type you are look at (in CAPITAL)
-- VARCHAR2, NUMBER, etc.
  v_data_type VARCHAR2(255) :='VARCHAR2';

-- Type the string you are looking at
  v_search_string VARCHAR2(4000) :='%lower-search-sub-string%';

BEGIN
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP

    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name||' WHERE lower('||t.column_name||') like :1'
    INTO match_count
    USING v_search_string;

    IF match_count > 0 THEN
      dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
    END IF;

  END LOOP;
END;
/

7

네, 당신은 할 수 있고 당신의 DBA는 당신을 미워할 것이고, 많은 I / O를 유발하고 캐시가 제거 될 때 데이터베이스 성능을 정말로 저하시킬 것이기 때문에 당신의 신발을 바닥에 못 박는 것을 알게 될 것입니다.

select column_name from all_tab_columns c, user_all_tables u where c.table_name = u.table_name;

시작합니다.

나는 사용하여 실행 쿼리를 시작할 것 v$session과를 v$sqlarea. 이것은 오라클 버전에 따라 변경됩니다. 이것은 공간을 좁히고 모든 것을 치지 않습니다.


7

나는 이것이 오래된 주제라는 것을 알고 있습니다. 그러나 나는을 SQL사용하는 대신 에서 할 수 있는지 묻는 질문에 대한 의견을 봅니다 PL/SQL. 그래서 해결책을 게시하려고 생각했습니다.

아래 데모는 전체 SCHEMA에있는 모든 TABLES의 모든 COLUMNS에서 VALUE검색하는 것입니다 .

  • CHARACTER 유형 검색

스키마 에서 값 KING을 찾아 보겠습니다 SCOTT.

SQL> variable val varchar2(10)
SQL> exec :val := 'KING'

PL/SQL procedure successfully completed.

SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
  2    SUBSTR (table_name, 1, 14) "Table",
  3    SUBSTR (column_name, 1, 14) "Column"
  4  FROM cols,
  5    TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
  6    || column_name
  7    || ' from '
  8    || table_name
  9    || ' where upper('
 10    || column_name
 11    || ') like upper(''%'
 12    || :val
 13    || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
 14  ORDER BY "Table"
 15  /

Searchword  Table          Column
----------- -------------- --------------
KING        EMP            ENAME

SQL>
  • NUMERIC 유형 검색

스키마 에서 값 20을 찾아 보겠습니다 SCOTT.

SQL> variable val NUMBER
SQL> exec :val := 20

PL/SQL procedure successfully completed.

SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
  2    SUBSTR (table_name, 1, 14) "Table",
  3    SUBSTR (column_name, 1, 14) "Column"
  4  FROM cols,
  5    TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
  6    || column_name
  7    || ' from '
  8    || table_name
  9    || ' where upper('
 10    || column_name
 11    || ') like upper(''%'
 12    || :val
 13    || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
 14  ORDER BY "Table"
 15  /

Searchword  Table          Column
----------- -------------- --------------
20          DEPT           DEPTNO
20          EMP            DEPTNO
20          EMP            HIREDATE
20          SALGRADE       HISAL
20          SALGRADE       LOSAL

SQL>

6
hrmm .... xml을 사용하는 것은 과잉처럼 보입니다. 게다가 :Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
towi

2
ORA-19202 : XML 처리 중 오류가 발생했습니다 ORA-00932 : 데이터 유형이 일치하지 않습니다 : 예상 된 CHAR에 BLOB가 있습니다 % s "* Cause : XML 함수를 처리 할 때 오류가 발생했습니다. * Action : 주어진 오류 메시지를 확인하고 적절한 문제를 수정하십시오
Mohammad Faisal

어떤 아이디어? ORA-19202 : XML 처리 중 오류 발생 ORA-22813 : 피연산자 값이 시스템 제한을 초과했습니다 .ORA-06512 : "SYS.DBMS_XMLGEN", 288 행 ORA-06512 : 1 행
Menios

5

나는 이와 같은 일을 할 것입니다 (필요한 모든 선택을 생성합니다). 나중에 sqlplus에 공급할 수 있습니다.

echo "select table_name from user_tables;" | sqlplus -S user/pwd | grep -v "^--" | grep -v "TABLE_NAME" | grep "^[A-Z]" | while read sw;
do echo "desc $sw" | sqlplus -S user/pwd | grep -v "\-\-\-\-\-\-" | awk -F' ' '{print $1}' | while read nw;
do echo "select * from $sw where $nw='val'";
done;
done;

결과 :

select * from TBL1 where DESCRIPTION='val'
select * from TBL1 where ='val'
select * from TBL2 where Name='val'
select * from TBL2 where LNG_ID='val'

그리고 그것이하는 일은-각각에 대해 (desc에서) 각 필드 table_nameuser_tables가져오고 필드가 'val'과 같은 테이블에서 select *를 만듭니다.


5

더 빠른 실행을 위해 각 테이블의 모든 열이 아닌 각 테이블에 대해 한 번씩 실행되도록 Flood의 스크립트를 수정했습니다. Oracle 11g 이상이 필요합니다.

    set serveroutput on size 100000

declare
    v_match_count integer;
    v_counter integer;

    -- The owner of the tables to search through (case-sensitive)
    v_owner varchar2(255) := 'OWNER_NAME';
    -- A string that is part of the data type(s) of the columns to search through (case-insensitive)
    v_data_type varchar2(255) := 'CHAR';
    -- The string to be searched for (case-insensitive)
    v_search_string varchar2(4000) := 'FIND_ME';

    -- Store the SQL to execute for each table in a CLOB to get around the 32767 byte max size for a VARCHAR2 in PL/SQL
    v_sql clob := '';
begin
    for cur_tables in (select owner, table_name from all_tables where owner = v_owner and table_name in 
                       (select table_name from all_tab_columns where owner = all_tables.owner and data_type like '%' ||  upper(v_data_type) || '%')
                       order by table_name) loop
        v_counter := 0;
        v_sql := '';

        for cur_columns in (select column_name from all_tab_columns where 
                            owner = v_owner and table_name = cur_tables.table_name and data_type like '%' || upper(v_data_type) || '%') loop
            if v_counter > 0 then
                v_sql := v_sql || ' or ';
            end if;
            v_sql := v_sql || 'upper(' || cur_columns.column_name || ') like ''%' || upper(v_search_string) || '%''';
            v_counter := v_counter + 1;
        end loop;

        v_sql := 'select count(*) from ' || cur_tables.table_name || ' where ' || v_sql;

        execute immediate v_sql
        into v_match_count;

        if v_match_count > 0 then
            dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records');
        end if;
    end loop;

    exception
        when others then
            dbms_output.put_line('Error when executing the following: ' || dbms_lob.substr(v_sql, 32600));
end;
/

5

@Lalit Kumars 답변에 대해 다음과 같은 문제가 발생했습니다.

ORA-19202: Error occurred in XML processing
ORA-00904: "SUCCESS": invalid identifier
ORA-06512: at "SYS.DBMS_XMLGEN", line 288
ORA-06512: at line 1
19202. 00000 -  "Error occurred in XML processing%s"
*Cause:    An error occurred when processing the XML function
*Action:   Check the given error message and fix the appropriate problem

해결책은 다음과 같습니다.

WITH  char_cols AS
  (SELECT /*+materialize */ table_name, column_name
   FROM   cols
   WHERE  data_type IN ('CHAR', 'VARCHAR2'))
SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
       SUBSTR (table_name, 1, 14) "Table",
       SUBSTR (column_name, 1, 14) "Column"
FROM   char_cols,
       TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select "'
       || column_name
       || '" from "'
       || table_name
       || '" where upper("'
       || column_name
       || '") like upper(''%'
       || :val
       || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
ORDER  BY "Table"
/ 

4

테이블과 열 이름을 알고 있지만 각 스키마에 대해 문자열이 나타나는 횟수를 확인하려는 경우 :

Declare

owner VARCHAR2(1000);
tbl VARCHAR2(1000);
cnt number;
ct number;
str_sql varchar2(1000);
reason varchar2(1000);
x varchar2(1000):='%string_to_be_searched%';

cursor csr is select owner,table_name 
from all_tables where table_name ='table_name';

type rec1 is record (
ct VARCHAR2(1000));

type rec is record (
owner VARCHAR2(1000):='',
table_name VARCHAR2(1000):='');

rec2 rec;
rec3 rec1;
begin

for rec2 in csr loop

--str_sql:= 'select count(*) from '||rec.owner||'.'||rec.table_name||' where CTV_REMARKS like '||chr(39)||x||chr(39);
--dbms_output.put_line(str_sql);
--execute immediate str_sql

execute immediate 'select count(*) from '||rec2.owner||'.'||rec2.table_name||' where column_name like '||chr(39)||x||chr(39)
into rec3;
if rec3.ct <> 0 then
dbms_output.put_line(rec2.owner||','||rec3.ct);
else null;
end if;
end loop;
end;

2

전체 데이터베이스 검색 절차 :

    CREATE or REPLACE PROCEDURE SEARCH_DB(SEARCH_STR IN VARCHAR2, TAB_COL_RECS OUT VARCHAR2) IS
      match_count integer;
      qry_str varchar2(1000);
      CURSOR TAB_COL_CURSOR IS 
          SELECT TABLE_NAME,COLUMN_NAME,OWNER,DATA_TYPE FROM ALL_TAB_COLUMNS WHERE DATA_TYPE in ('NUMBER','VARCHAR2') AND OWNER='SCOTT';
          BEGIN  
            FOR TAB_COL_REC  IN TAB_COL_CURSOR
            LOOP
              qry_str := 'SELECT COUNT(*) FROM '||TAB_COL_REC.OWNER||'.'||TAB_COL_REC.TABLE_NAME|| 
              ' WHERE '||TAB_COL_REC.COLUMN_NAME;
               IF TAB_COL_REC.DATA_TYPE = 'NUMBER' THEN
                      qry_str := qry_str||'='||SEARCH_STR; 
               ELSE
                       qry_str := qry_str||' like '||SEARCH_STR; 
               END IF;
                       --dbms_output.put_line( qry_str );
                EXECUTE IMMEDIATE  qry_str  INTO match_count;
                IF match_count > 0 THEN          
                   dbms_output.put_line( qry_str );
                  --dbms_output.put_line( TAB_COL_REC.TABLE_NAME ||' '||TAB_COL_REC.COLUMN_NAME ||' '||match_count);     
                    TAB_COL_RECS := TAB_COL_RECS||'@@'||TAB_COL_REC.TABLE_NAME||'##'||TAB_COL_REC.COLUMN_NAME;
                END IF; 
          END LOOP;
     END SEARCH_DB;    

문 실행

  DECLARE
    SEARCH_STR VARCHAR2(200);
    TAB_COL_RECS VARCHAR2(200);
    BEGIN
      SEARCH_STR := 10;
      SEARCH_DB(
        SEARCH_STR => SEARCH_STR,
        TAB_COL_RECS => TAB_COL_RECS
      );
     DBMS_OUTPUT.PUT_LINE('TAB_COL_RECS = ' || TAB_COL_RECS);
     END;

샘플 결과

Connecting to the database test.
SELECT COUNT(*) FROM SCOTT.EMP WHERE DEPTNO=10
SELECT COUNT(*) FROM SCOTT.DEPT WHERE DEPTNO=10
TAB_COL_RECS = @@EMP##DEPTNO@@DEPT##DEPTNO
Process exited.
Disconnecting from the database test.

1

SQL 프롬프트에 대한 간단한 솔루션이 아닙니다. 그러나 사용자가 검색 할 문자열을 입력 할 수있는 GUI가있는 두꺼비 및 PL / SQL Developer와 같은 도구가 많이 있으며 이것이 발견 된 테이블 / 프로 시저 / 객체를 반환합니다.


1

이러한 종류의 검색을 수행하는 몇 가지 무료 도구가 있습니다. 예를 들어이 도구는 제대로 작동하며 소스 코드를 사용할 수 있습니다. https://sites.google.com/site/freejansoft/dbsearch

이 도구를 사용하려면 Oracle ODBC 드라이버와 DSN이 필요합니다.


1

정확히 일치하는 항목을 찾는 대신 LIKE 쿼리를 사용하여 대소 문자를 구분하지 않고 검색하도록 코드 수정 ...

DECLARE
  match_count INTEGER;
  -- Type the owner of the tables you want to search.
  v_owner VARCHAR2(255) :='USER';
  -- Type the data type you're looking for (in CAPS). Examples include: VARCHAR2, NUMBER, etc.
  v_data_type VARCHAR2(255) :='VARCHAR2';
  -- Type the string you are looking for.
  v_search_string VARCHAR2(4000) :='Test';
BEGIN
  dbms_output.put_line( 'Starting the search...' );
  FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP
    EXECUTE IMMEDIATE 
    'SELECT COUNT(*) FROM '||t.table_name||' WHERE LOWER('||t.column_name||') LIKE :1'
    INTO match_count
    USING LOWER('%'||v_search_string||'%');
    IF match_count > 0 THEN
      dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
    END IF;
  END LOOP;
END;

0

-실행 완료-오류 없음

    SET SERVEROUTPUT ON SIZE 100000

DECLARE
   v_match_count     INTEGER;
   v_counter         INTEGER;




v_owner           VARCHAR2 (255) := 'VASOA';
v_search_string   VARCHAR2 (4000) := '99999';
v_data_type       VARCHAR2 (255) := 'CHAR';
v_sql             CLOB := '';

BEGIN
   FOR cur_tables
      IN (  SELECT owner, table_name
              FROM all_tables
             WHERE     owner = v_owner
                   AND table_name IN (SELECT table_name
                                        FROM all_tab_columns
                                       WHERE     owner = all_tables.owner
                                             AND data_type LIKE
                                                       '%'
                                                    || UPPER (v_data_type)
                                                    || '%')
          ORDER BY table_name)
   LOOP
      v_counter := 0;
      v_sql := '';

      FOR cur_columns
         IN (SELECT column_name, table_name
               FROM all_tab_columns
              WHERE     owner = v_owner
                    AND table_name = cur_tables.table_name
                    AND data_type LIKE '%' || UPPER (v_data_type) || '%')
      LOOP
         IF v_counter > 0
         THEN
            v_sql := v_sql || ' or ';
         END IF;

         IF cur_columns.column_name is not null
         THEN
            v_sql :=
                  v_sql
               || 'upper('
               || cur_columns.column_name
               || ') ='''
               || UPPER (v_search_string)||'''';

            v_counter := v_counter + 1;
         END IF;

      END LOOP;

      IF v_sql is  null
      THEN
         v_sql :=
               'select count(*) from '
            || v_owner
            || '.'
            || cur_tables.table_name;

      END IF;

      IF v_sql is not null
      THEN
         v_sql :=
               'select count(*) from '
            || v_owner
            || '.'
            || cur_tables.table_name
            || ' where '
            || v_sql;
      END IF;

      --v_sql := 'select count(*) from ' ||v_owner||'.'|| cur_tables.table_name ||' where '||  v_sql;


      --dbms_output.put_line(v_sql);
      --DBMS_OUTPUT.put_line (v_sql);

      EXECUTE IMMEDIATE v_sql INTO v_match_count;

      IF v_match_count > 0
      THEN
        DBMS_OUTPUT.put_line (v_sql);
        dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records');
      END IF;

   END LOOP;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (
            'Error when executing the following: '
         || DBMS_LOB.SUBSTR (v_sql, 32600));
END;
/

0

이 블로그 게시물 에서 차용, 약간 향상 및 단순화 하면 다음과 같은 간단한 SQL 문이 작업을 잘 수행하는 것 같습니다.

SELECT DISTINCT (:val) "Search Value", TABLE_NAME "Table", COLUMN_NAME "Column"
FROM cols,
     TABLE (XMLSEQUENCE (DBMS_XMLGEN.GETXMLTYPE(
       'SELECT "' || COLUMN_NAME || '" FROM "' || TABLE_NAME || '" WHERE UPPER("'
       || COLUMN_NAME || '") LIKE UPPER(''%' || :val || '%'')' ).EXTRACT ('ROWSET/ROW/*')))
ORDER BY "Table";

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.