Tìm kiếm tất cả các trường trong tất cả các bảng để có giá trị cụ thể (Oracle)


115

Có thể tìm kiếm mọi trường của mọi bảng cho một giá trị cụ thể trong Oracle không?

Có hàng trăm bảng với hàng nghìn hàng trong một số bảng nên tôi biết điều này có thể mất nhiều thời gian để truy vấn. Nhưng điều duy nhất tôi biết là giá trị cho trường mà tôi muốn truy vấn là 1/22/2008P09RR8. <

Tôi đã thử sử dụng câu lệnh này bên dưới để tìm một cột thích hợp dựa trên những gì tôi nghĩ nó nên được đặt tên nhưng nó không trả về kết quả.

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

Hoàn toàn không có tài liệu về cơ sở dữ liệu này và tôi không biết trường này được lấy từ đâu.

Có suy nghĩ gì không?


Chúng ta có thể thực hiện việc này bằng cách sử dụng một truy vấn thay vì sử dụng một thủ tục được lưu trữ không?
Freakyuser


@LalitKumarB Trang bạn đã liệt kê không thể truy cập được nữa. Có thể đăng một số thông tin như một câu trả lời?
Dodzi Dzakuma,

@DodziDzakuma Trang có thể truy cập lalitkumarb.wordpress.com/2015/01/06/... Ngoài ra tôi đã đăng một câu trả lời, xin vui lòng di chuyển xuống hoặc xem stackoverflow.com/a/27794127/3989608
Lalit Kumar B

Nếu bạn gặp khó khăn khi tìm ra truy vấn Lalit Kumar, hãy thử bản trình diễn này: sqlfiddle.com/#!4/76924c/2/0
DxTx

Câu trả lời:


93

Trích dẫn:

Tôi đã thử sử dụng câu lệnh này bên dưới để tìm một cột thích hợp dựa trên những gì tôi nghĩ rằng nó nên được đặt tên nhưng nó không trả về kết quả. *

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

Một cột không phải là một đối tượng. Nếu bạn muốn tên cột giống như '% DTN%', truy vấn bạn muốn là:

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

Nhưng nếu chuỗi 'DTN' chỉ là phỏng đoán của bạn, điều đó có thể sẽ không hữu ích.

Nhân tiện, bạn có chắc chắn rằng '1/22 ​​/ 2008P09RR8' là một giá trị được chọn trực tiếp từ một cột duy nhất? Nếu bạn hoàn toàn không biết nó đến từ đâu, nó có thể là sự ghép nối của một số cột hoặc kết quả của một số hàm hoặc một giá trị nằm trong một đối tượng bảng lồng nhau. Vì vậy, bạn có thể đang trong một cuộc rượt đuổi ngỗng hoang khi cố gắng kiểm tra mọi cột cho giá trị đó. Bạn có thể không bắt đầu với bất kỳ ứng dụng khách nào đang hiển thị giá trị này và cố gắng tìm ra nó đang sử dụng truy vấn nào để lấy nó?

Dù sao, câu trả lời của diciu đưa ra một phương pháp tạo truy vấn SQL để kiểm tra mọi cột của mọi bảng để tìm giá trị. Bạn cũng có thể thực hiện những công việc tương tự hoàn toàn trong một phiên SQL bằng cách sử dụng khối PL / SQL và SQL động. Đây là một số mã được viết vội cho điều đó:

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

Có một số cách bạn cũng có thể làm cho nó hiệu quả hơn.

Trong trường hợp này, với giá trị bạn đang tìm kiếm, bạn có thể loại bỏ rõ ràng bất kỳ cột nào thuộc loại NUMBER hoặc DATE, điều này sẽ làm giảm số lượng truy vấn. Thậm chí có thể hạn chế nó ở các cột có kiểu như '% CHAR%'.

Thay vì một truy vấn trên mỗi cột, bạn có thể tạo một truy vấn cho mỗi bảng như sau:

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

Bạn nên hạn chế nó ở các cột char, varchar và varchar2, vì các cột số và ngày không thể chứa chuỗi đó.
Erich Kitzmueller

8
@ammoQ - như tôi đã nói trong đoạn thứ hai đến cuối cùng?
Dave Costa

Tôi đã chạy điều này trên 9i và tôi nhận được lỗi không xác định column_name. Ai đó có thể cho tôi biết sửa đổi nào sẽ được yêu cầu để chạy điều này trên 9i không?
Regmi

@Regmi - xin lỗi, đó thực sự là lỗi trong mã của tôi, không phải vấn đề về phiên bản. Vòng lặp nên được điều khiển bởi all_tab_columnskhông all_tables. Tôi đã sửa nó.
Dave Costa

@DaveCosta - Cảm ơn bạn đã sửa lỗi nhưng tôi vẫn gặp lỗi 'bảng hoặc chế độ xem không tồn tại' trên dòng 6. Dòng 6 là "Thực thi ngay lập tức".
Regmi

34

Tôi đã thực hiện một số sửa đổi đối với mã trên để làm cho nó hoạt động nhanh hơn nếu bạn chỉ tìm kiếm ở một chủ sở hữu. Bạn chỉ cần thay đổi 3 biến v_owner, v_data_type và v_search_string để phù hợp với những gì bạn đang tìm kiếm.

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

Tôi đã phải nhận xét dòng đầu tiên để có thể chạy truy vấn này. Ngoài ra, tôi không thể xóa bộ lọc chủ sở hữu và chạy truy vấn.
Popa Andrei

1
Tôi cần phải đặt dấu ngoặc kép quanh tên tên bảng / cột để tránh các vấn đề khi những cần phải được trích dẫn:'SELECT COUNT(*) FROM "'||t.table_name||'" WHERE "'||t.column_name||'" = :1'
Steve Chambers

Lưu ý rằng all_tab_cols cũng chứa các lượt xem, mặc dù có tên
phil_w.

chính xác là dbms_outputgì? Bởi vì các truy vấn được thực thi thành công trong DataGrip, nhưng tôi không thấy bất kỳ kết quả nào sau đó.
misteeque

Tôi biết cái này hơi cũ, nhưng khi tôi chạy cái này, tôi chỉ nhận được Đầu ra Tập lệnh là "khối ẩn danh đã hoàn thành"
JasonWH

7

Đây là một phiên bản được sửa đổi khác sẽ so sánh một chuỗi con thấp hơn. Điều này hoạt động trong 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

Có, bạn có thể và DBA của bạn sẽ ghét bạn và sẽ thấy bạn đóng đinh giày xuống sàn vì điều đó sẽ gây ra rất nhiều I / O và làm giảm hiệu suất cơ sở dữ liệu khi bộ nhớ cache bị xóa.

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

Cho một sự khởi đầu.

Tôi sẽ bắt đầu với các truy vấn đang chạy, sử dụng dấu v$sessionv$sqlarea. Điều này thay đổi dựa trên phiên bản oracle. Điều này sẽ thu hẹp không gian và không đánh trúng mọi thứ.


7

Tôi biết đây là một chủ đề cũ. Nhưng tôi thấy một bình luận cho câu hỏi hỏi liệu nó có thể được thực hiện trong SQLthay vì sử dụng PL/SQL. Vì vậy, suy nghĩ để đăng một giải pháp.

Trình diễn dưới đây là Tìm kiếm GIÁ TRỊ trong tất cả CỘT của tất cả các BẢNG trong toàn bộ SCHEMA :

  • Tìm kiếm loại CHARACTER

Hãy tìm kiếm giá trị KINGtrong SCOTTlược đồ.

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>
  • Tìm kiếm một loại NUMERIC

Hãy tìm kiếm giá trị 20trong SCOTTlược đồ.

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 .... sử dụng xml có vẻ như quá mức cần thiết. Bên cạnh đó:Error occurred in XML processing ORA-00932: inconsistent datatypes: expected NUMBER got BLOB
towi

2
ORA-19202: Đã xảy ra lỗi trong xử lý XML ORA-00932: kiểu dữ liệu không nhất quán: CHAR dự kiến ​​nhận được BLOB ORA-06512: tại "SYS.DBMS_XMLGEN", dòng 288 ORA-06512: tại dòng 1 19202. 00000 - "Đã xảy ra lỗi trong xử lý XML % s" * Nguyên nhân: Có lỗi xảy ra khi xử lý các chức năng XML * hành động: Kiểm tra các thông báo lỗi nhất định và giải quyết vấn đề phù hợp
Mohammad Faisal

Bất kỳ ý tưởng? ORA-19202: Đã xảy ra lỗi trong xử lý XML ORA-22813: giá trị toán hạng vượt quá giới hạn hệ thống ORA-06512: tại "SYS.DBMS_XMLGEN", dòng 288 ORA-06512: tại dòng 1
Menios

5

Tôi sẽ làm một cái gì đó như thế này (tạo tất cả các lựa chọn bạn cần). Sau đó, bạn có thể đưa chúng vào 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;

Nó mang lại:

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

Và những gì nó làm là - cho mỗi table_nametừ user_tableslấy từng trường (từ mô tả) và tạo một lựa chọn * từ bảng trong đó trường bằng 'val'.


5

Tôi đã sửa đổi tập lệnh của Flood để thực thi một lần cho mỗi bảng thay vì cho mỗi cột của mỗi bảng để thực thi nhanh hơn. Nó yêu cầu Oracle 11g trở lên.

    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

Tôi gặp sự cố sau cho câu trả lời của @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

Giải pháp là:

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

nếu chúng ta biết tên bảng và cột nhưng muốn tìm số lần chuỗi xuất hiện cho mỗi lược đồ:

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

Quy trình tìm kiếm toàn bộ cơ sở dữ liệu:

    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;    

Thực thi Tuyên bố

  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;

Kết quả mẫu

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

Tôi không có một giải pháp đơn giản trên bảng nhắc SQL. Tuy nhiên, có một số công cụ như cóc và PL / SQL Developer có GUI nơi người dùng có thể nhập chuỗi được tìm kiếm và nó sẽ trả về bảng / thủ tục / đối tượng nơi tìm thấy nó.


1

Có một số công cụ miễn phí thực hiện loại tìm kiếm này, chẳng hạn như công cụ này hoạt động tốt và có mã nguồn: https://sites.google.com/site/freejansoft/dbsearch

Bạn sẽ cần trình điều khiển Oracle ODBC và DSN để sử dụng công cụ này.


1

Sửa đổi mã để tìm kiếm phân biệt chữ hoa chữ thường bằng cách sử dụng truy vấn LIKE thay vì tìm các kết quả phù hợp chính xác ...

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

- nó chạy hoàn tất - không có lỗi

    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

Vay mượn, cải tiến một chút và đơn giản hóa từ bài đăng trên Blog này, câu lệnh SQL đơn giản sau có vẻ hoạt động khá tốt:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.