2012-10-16 69 views
2

我需要搜索oracle數據庫中的所有表以查找特定字符串,並返回找到該字符串的所有記錄。我正在與SQL Developer合作。有幾個非常有用的腳本和存儲過程已在線發佈,它們提供了一種搜索整個數據庫的方法,並且它們似乎都能夠返回表名和列名,以找到字符串。我真的想看到像select *語句那樣的行,但我希望它適用於我數據庫中的所有表。我想要說明的是,我非常瞭解初學者,並且我不熟悉高級PL/SQL腳本和數據庫概念,所以雖然我已經嘗試過並嘗試過了,但似乎無法弄清楚,因此不用理會任何輸入。Oracle數據庫搜索所有表中的字符串,返回行數據

這裏是我試圖修改

declare 
l_count number := 0; 
l_str varchar2(20) := '%test%'; 
begin 
for rec in (select table_name, column_name 
      from user_tab_columns 
      where data_type in ('VARCHAR2' , 'VARCHAR', 'CHAR')) loop 
    execute immediate 'select count(*) from '||rec.table_name|| 
       ' where '||rec.column_name||' like '''||l_str||'''' into l_count; 
    if l_count > 0 then 
    dbms_output.put_line('Table : '||rec.table_name||' '||rec.column_name); 
    end if; 
end loop; 
end; 
/
+0

什麼數據,你想這個完全返回? (這soltn張貼的返回使用計數來確定該表是否包含任何具有該字符串的行) – tbone

+0

我希望能夠獲取具有特定字符串的記錄,並且還返回這些記錄的所有列值(整個信息行)。例如,當select * from emp;包含所有列和值的所有記錄都會返回。所以我想要那樣的東西,但是對於整個數據庫,並且能夠將它過濾到具有特定搜索字符串的記錄中。如果這是模糊的,我很抱歉。 – user1750939

+0

因爲每個表格中的列幾乎肯定會有所不同,所以您不能在所有與您的搜索詞匹配的表上執行SELECT *操作。您需要確定您真正需要的輸出列,然後將所有表連接在一起以獲取這些列,然後根據您的搜索詞進行篩選 – Tobsey

回答

2

你是想建立一個基於一個關鍵的詞完整的數據庫搜索腳本(別人的解決方案)?您可以通過以下代碼獲取表名,表列名稱和行數。但是,您不能在同一代碼中獲取行數據,您可以根據搜索結果獲取行數據。

--Set output size 
    SET serveroutput ON size 1000000 

    DECLARE 
     -- var table Name for cursor loop. 
     t_c1_tname  user_tab_columns.table_name%TYPE; 
     -- var column name for dynamic sql statement. 
     t_c1_cname  user_tab_columns.column_name%TYPE; 
     -- var string for dynamic sql statement. 
     t_command  VARCHAR2(200); 
     -- var for your search key word. 
     l_str varchar2(20) := '%test%'; 
     -- var for dynamic cursor. 
     t_cid   INTEGER; 
     -- var for total row counts. 
     t_total_records NUMBER(10); 
     -- var for stat of executing dynamic sql statement. 
     stat   INTEGER; 
     --var for each loop row counts. 
     row_count  INTEGER; 
     -- var for minimum search result, here I set value = 0; 
     t_limit   INTEGER := 0; -- Only show tables with more rows 

     -- cursor gets all table name, column name. 
     CURSOR c1 IS select table_name, column_name 
     from user_tab_columns 
     where data_type in ('VARCHAR2' , 'VARCHAR', 'CHAR'); 
    BEGIN 
     t_limit := 0; 
     OPEN c1; 
     LOOP 
     FETCH c1 INTO t_c1_tname,t_c1_cname; 
     EXIT WHEN c1%NOTFOUND; 
     -- Here create dynamic sql statement. 
     t_command := 'SELECT COUNT(0) FROM '||t_c1_tname || ' where ' || t_c1_cname ||' like '''|| l_str||''''; 
     t_cid := DBMS_SQL.OPEN_CURSOR; 
     DBMS_SQL.PARSE(t_cid,t_command,DBMS_SQL.native); 
     DBMS_SQL.DEFINE_COLUMN(t_cid,1,t_total_records); 
     -- Here execute dynamic sql statement. 
     stat := DBMS_SQL.EXECUTE(t_cid); 
     row_count := DBMS_SQL.FETCH_ROWS(t_cid); 
     -- Here get total row counts for each loop. 
     DBMS_SQL.COLUMN_VALUE(t_cid,1,t_total_records); 
     IF t_total_records > t_limit THEN 
     --Here output results 
     DBMS_OUTPUT.PUT_LINE(RPAD(t_c1_tname,55,' ')||RPAD(t_c1_cname,55,' ')|| 
         TO_CHAR(t_total_records,'99999999')||' record(s)'); 
     -- here you can insert results into your table. 
     --INSERT INTO search_db_results VALUES (t_c1_tname,t_c1_cname,t_total_records); 
     END IF; 
     DBMS_SQL.CLOSE_CURSOR(t_cid); 
     END LOOP; 
     CLOSE c1; 

    -- COMMIT if you have any insert statement. 
    -- COMMIT; 
    END; 
    /
+0

謝謝,我指的是基於關鍵詞的完整數據庫搜索。你似乎是正確的,這是不可能在我已經認識到的相同的代碼中完成的。我能夠獲取表名和行名。有沒有辦法將結果存儲在表或數組中,然後使用它來檢索這些行?我嘗試創建一個空表,並試圖插入我的結果到它使用 「立即執行」插入search_db_results ...「 而在循環內,但無法成功插入。 – user1750939

+0

將「DBMS_OUTPUT.PUT_LINE ...」代碼更改爲「INSERT INTO search_db_results VALUES(t_c1_tname,t_c1_cname,t_total_records);」。我的知識水平是非常基本的,所以如果您可以描述性的, –

+0

我在上面的代碼中添加了一些評論,希望它有幫助。 –

相關問題