2012-06-04 73 views
0

我需要找到在我的Oracle數據庫中的列值,但我不知道哪個 表或列它存儲在查找Oracle表中的具體數據

如何搜索特定or like %%數據我做

select * from SYS.dba_source 

是有這樣的

Column Name ID Data Type    Null?   Comments 

OWNER 1 VARCHAR2 (30 Byte)  Y 
NAME 2 VARCHAR2 (30 Byte)  Y Name of the object 
TYPE 3 VARCHAR2 (12 Byte)  Y  

Type of the object: 
"TYPE", "TYPE BODY", "PROCEDURE", "FUNCTION", 
"PACKAGE", "PACKAGE BODY" or "JAVA SOURCE" 

LINE 4 NUMBER     Y Line number of this line of source 
TEXT 5 VARCHAR2 (4000 Byte) Y Source text 
+0

我面對這個問題時,我有一個形式6I具有數據和我沒有源從那裏它得到它知道「表」,所以這是解決我節省時間搜索表randomaly方式 – shareef

回答

2

LINK: pl/sq to find any data in a schema

想象一下,在您的模式中有幾個表格,並且您希望在這些表格的所有列中查找特定值。理想情況下,會有一個SQL函數,如

select * from * where any(column) = 'value'; 

不幸的是,沒有這樣的功能。 但是,可以這樣寫一個函數。以下函數遍歷當前模式的所有表中的所有字符列,並嘗試在其中找到val。

create or replace function find_in_schema(val varchar2) 
    return varchar2 is 
     v_old_table user_tab_columns.table_name%type; 
     v_where  Varchar2(4000); 
     v_first_col boolean := true; 
     type rc  is ref cursor; 
     c   rc; 
     v_rowid  varchar2(20); 

    begin 
     for r in (
     select 
      t.* 
     from 
      user_tab_cols t, user_all_tables a 
     where t.table_name = a.table_name 
      and t.data_type like '%CHAR%' 
     order by t.table_name) loop 

     if v_old_table is null then 
      v_old_table := r.table_name; 
     end if; 

     if v_old_table <> r.table_name then 
      v_first_col := true; 

      -- dbms_output.put_line('searching ' || v_old_table); 

      open c for 'select rowid from "' || v_old_table || '" ' || v_where; 

      fetch c into v_rowid; 
      loop 
      exit when c%notfound; 
      dbms_output.put_line(' rowid: ' || v_rowid || ' in ' || v_old_table); 
      fetch c into v_rowid; 
      end loop; 

      v_old_table := r.table_name; 
     end if; 

     if v_first_col then 
      v_where := ' where ' || r.column_name || ' like ''%' || val || '%'''; 
      v_first_col := false; 
     else 
      v_where := v_where || ' or ' || r.column_name || ' like ''%' || val || '%'''; 
     end if; 

     end loop; 
     return 'Success'; 
    end;