0

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

1 回答 1

2

链接:pl/sq 在模式中查找任何数据

想象一下,您的架构中有几个表,您想在这些表中的所有列中查找特定值。理想情况下,会有一个类似的 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;
于 2012-06-04T09:59:14.247 回答