Cari Semua Bidang Di Semua Tabel Untuk Nilai Tertentu (Oracle)


115

Apakah mungkin untuk mencari setiap bidang dari setiap tabel untuk nilai tertentu di Oracle?

Ada ratusan tabel dengan ribuan baris di beberapa tabel jadi saya tahu ini bisa memakan waktu sangat lama untuk kueri. Tapi satu-satunya hal yang saya tahu adalah bahwa nilai untuk bidang yang ingin saya tanyakan adalah 1/22/2008P09RR8. <

Saya telah mencoba menggunakan pernyataan di bawah ini untuk menemukan kolom yang sesuai berdasarkan apa yang menurut saya harus dinamai tetapi tidak memberikan hasil.

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

Sama sekali tidak ada dokumentasi di database ini dan saya tidak tahu dari mana bidang ini ditarik.

Ada pemikiran?


Bisakah kita melakukan ini menggunakan satu kueri daripada menggunakan prosedur tersimpan?
Freakyuser

Ya, dimungkinkan untuk melakukannya dalam SQL murni. Lihat SQL untuk Mencari NILAI di semua KOLOM dari semua TABEL di seluruh SKEMA
Lalit Kumar B

@LalitKumarB Halaman yang Anda daftarkan tidak lagi dapat diakses. Apakah mungkin untuk memposting beberapa informasi sebagai jawaban?
Dodzi Dzakuma

@DodziDzakuma Halaman ini dapat diakses lalitkumarb.wordpress.com/2015/01/06/… Juga saya telah memposting jawaban, silakan gulir ke bawah atau lihat stackoverflow.com/a/27794127/3989608
Lalit Kumar B

Jika Anda mengalami kesulitan untuk mengetahui kueri Lalit Kumar, coba demo ini: sqlfiddle.com/#!4/76924c/2/0
DxTx

Jawaban:


93

Mengutip:

Saya telah mencoba menggunakan pernyataan di bawah ini untuk menemukan kolom yang sesuai berdasarkan apa yang menurut saya harus dinamai tetapi tidak memberikan hasil. *

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

Kolom bukanlah objek. Jika yang Anda maksud Anda mengharapkan nama kolom menjadi seperti '% DTN%', kueri yang Anda inginkan adalah:

SELECT owner, table_name, column_name FROM all_tab_columns WHERE column_name LIKE '%DTN%';

Tetapi jika string 'DTN' hanyalah tebakan di pihak Anda, itu mungkin tidak akan membantu.

Omong-omong, seberapa yakin Anda bahwa '1/22 ​​/ 2008P09RR8' adalah nilai yang dipilih langsung dari satu kolom? Jika Anda tidak tahu sama sekali dari mana asalnya, itu bisa berupa rangkaian beberapa kolom, atau hasil dari beberapa fungsi, atau nilai yang ada di objek tabel bertingkat. Jadi, Anda mungkin melakukan pengejaran liar mencoba memeriksa setiap kolom untuk nilai itu. Bisakah Anda tidak memulai dengan aplikasi klien apa pun yang menampilkan nilai ini dan mencoba mencari tahu kueri apa yang digunakan untuk mendapatkannya?

Bagaimanapun, jawaban diciu memberikan satu metode untuk menghasilkan kueri SQL untuk memeriksa setiap kolom dari setiap tabel untuk nilainya. Anda juga dapat melakukan hal serupa seluruhnya dalam satu sesi SQL menggunakan blok PL / SQL dan SQL dinamis. Berikut beberapa kode yang ditulis dengan tergesa-gesa untuk itu:

    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;
    /

Ada beberapa cara untuk membuatnya lebih efisien juga.

Dalam kasus ini, dengan nilai yang Anda cari, Anda dapat dengan jelas menghilangkan kolom apapun yang berjenis NOMOR atau TANGGAL, yang akan mengurangi jumlah kueri. Mungkin bahkan membatasinya ke kolom dengan tipe seperti '% CHAR%'.

Alih-alih satu kueri per kolom, Anda bisa membuat satu kueri per tabel seperti ini:

SELECT * FROM table1
  WHERE column1 = 'value'
     OR column2 = 'value'
     OR column3 = 'value'
     ...
     ;

Anda harus membatasinya ke kolom char, varchar dan varchar2, karena kolom nomor dan tanggal tidak mungkin berisi string itu.
Erich Kitzmueller

8
@ MammoQ - seperti yang saya katakan di paragraf kedua hingga terakhir?
Dave Costa

Saya menjalankan ini di 9i dan saya mendapatkan kesalahan nama_kolom yang tidak diketahui. Bisakah seseorang memberi tahu saya modifikasi apa yang diperlukan untuk menjalankan ini di 9i?
Regmi

@Regmi - maaf, itu sebenarnya kesalahan dalam kode saya, bukan masalah versi. Perulangan seharusnya didorong oleh all_tab_columnsnot all_tables. Saya sudah memperbaikinya.
Dave Costa

@DaveCosta - Terima kasih atas perbaikannya tetapi saya masih mendapatkan kesalahan 'tabel atau tampilan tidak ada' di baris 6. Baris 6 adalah "Jalankan Segera".
Regmi

34

Saya melakukan beberapa modifikasi pada kode di atas untuk membuatnya bekerja lebih cepat jika Anda mencari hanya di satu pemilik. Anda hanya perlu mengubah 3 variabel v_owner, v_data_type dan v_search_string agar sesuai dengan yang Anda cari.

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;
/

Saya harus memberi komentar pada baris pertama agar dapat menjalankan kueri ini. Saya juga tidak dapat menghapus filter pemilik dan menjalankan kueri.
Popa Andrei

1
Saya perlu memberi tanda kutip ganda di sekitar nama tabel / nama kolom untuk menghindari masalah ketika ini perlu dikutip:'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
Steve Chambers

Hati-hati bahwa all_tab_cols juga berisi tampilan, terlepas dari namanya
phil_w

apa sebenarnya itu dbms_output? Karena kueri berhasil dieksekusi di DataGrip, tetapi saya tidak melihat hasil apa pun setelahnya.
misteeque

Saya tahu ini agak tua, tetapi ketika saya menjalankan ini saya hanya mendapatkan Output Skrip "blok anonim selesai"
JasonWH

7

Berikut adalah versi modifikasi lain yang akan membandingkan kecocokan substring yang lebih rendah. Ini berfungsi di 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

Ya, Anda bisa dan DBA Anda akan membenci Anda dan akan menemukan Anda untuk membanting tulang karena hal itu akan menyebabkan banyak I / O dan menurunkan kinerja database saat cache dibersihkan.

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

sebagai permulaan.

Saya akan mulai dengan kueri yang sedang berjalan, menggunakan v$sessiondan v$sqlarea. Perubahan ini berdasarkan versi oracle. Ini akan mempersempit ruang dan tidak mengenai segalanya.


7

Saya tahu ini adalah topik lama. Tapi saya melihat komentar untuk pertanyaan yang menanyakan apakah itu bisa dilakukan SQLdaripada menggunakan PL/SQL. Jadi berpikir untuk memposting solusi.

Demonstrasi di bawah ini adalah untuk Mencari NILAI di semua KOLOM dari semua TABEL di seluruh SKEMA :

  • Cari tipe KARAKTER

Mari kita lihat nilainya KINGdiSCOTTskema.

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>
  • Cari jenis NUMERIC

Mari kita cari nilai 20dalam SCOTTskema.

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 .... menggunakan xml sepertinya berlebihan. Selain itu:Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
towi

2
ORA-19202: Terjadi kesalahan dalam pemrosesan XML ORA-00932: tipe data tidak konsisten: diharapkan CHAR mendapat BLOB ORA-06512: pada "SYS.DBMS_XMLGEN", baris 288 ORA-06512: pada baris 1 19202. 00000 - "Terjadi kesalahan dalam pemrosesan XML % s "* Penyebab: Terjadi kesalahan saat memproses fungsi XML * Tindakan: Periksa pesan kesalahan yang diberikan dan perbaiki masalah yang sesuai
Mohammad Faisal

Ada Ide? ORA-19202: Terjadi kesalahan dalam pemrosesan XML ORA-22813: nilai operan melebihi batas sistem ORA-06512: pada "SYS.DBMS_XMLGEN", baris 288 ORA-06512: pada baris 1
Menios

5

Saya akan melakukan sesuatu seperti ini (menghasilkan semua pilihan yang Anda butuhkan). Anda nanti dapat memberi mereka makan ke 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;

Ini menghasilkan:

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

Dan yang dilakukannya adalah - untuk masing-masing table_namedari user_tablesdapatkan setiap bidang (dari desc) dan buatlah * pilih dari tabel di mana bidang sama dengan 'val'.


5

Saya memodifikasi skrip Flood untuk mengeksekusi satu kali untuk setiap tabel daripada untuk setiap kolom dari setiap tabel untuk eksekusi yang lebih cepat. Ini membutuhkan Oracle 11g atau lebih tinggi.

    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

Saya mengalami masalah berikut untuk jawaban @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

Solusinya adalah:

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

jika kita mengetahui nama tabel dan kolom tetapi ingin mengetahui berapa kali string muncul untuk setiap skema:

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

Prosedur untuk Mencari Seluruh Database:

    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;    

Pernyataan Eksekusi

  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;

Hasil Sampel

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

Saya bukan dari solusi sederhana pada perintah SQL. Namun ada beberapa alat seperti katak dan PL / SQL Developer yang memiliki GUI di mana pengguna dapat memasukkan string yang akan dicari dan akan mengembalikan tabel / prosedur / objek tempat ditemukan.



1

Memodifikasi kode untuk mencari case-insensitively menggunakan query LIKE daripada menemukan kecocokan persis ...

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

- itu berjalan selesai - tidak ada kesalahan

    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

Meminjam, sedikit meningkatkan dan menyederhanakan dari posting Blog ini, pernyataan SQL sederhana berikut tampaknya melakukan pekerjaan dengan cukup baik:

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";

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.