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