在Oracle Tables中查找特定数据

时间:2012-06-04 09:59:14

标签: sql oracle plsql

我需要在我的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

1 个答案:

答案 0 :(得分:2)

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

想象一下,您的架构中有几个表,并且您希望在这些表中的所有列中找到特定值。理想情况下,会有像

这样的sql函数
select * from * where any(column) = 'value';

不幸的是,没有这样的功能。 但是,可以编写 PL/SQL 函数来执行此操作。以下函数迭代当前模式的所有表中的所有字符列,并尝试在其中查找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;