1.我有一个2000个表的oracle数据库,每个表中都有若干个类型为char(20)的字段.
现在我有一个主键,这个主键是某个表中某个类型为char(20)的字段的值,那么请问如何通过一个存储过程或者函数把这个主键传进去,得到这个主键在哪个表的哪个字段上?
注: 此主键 是全数据库中唯一的.

解决方案 »

  1.   

    表名是存在一个表里的
    create table tablenames
    (
    tablename varchar(50)
    )
    insert into tablenames values('tableA');
    select tablename from tablenames;
    也就是说表名的列表可以从这个tablenams表中查到 
      

  2.   

    select TABLE_NAME from all_tab_columns where COLUMN_NAME = '';dba_constraints a where a.CONSTRAINT_TYPE = 'P'
      

  3.   

    SELECT TABLE_NAME, COLUMN_NAME
      FROM USER_CONS_COLUMNS
     WHERE CONSTRAINT_NAME = UPPER('BJ_GWZBWH')
      

  4.   

    谢谢楼上二位
    但我要的不是列名,而是列值呀
    就是说有这个主键 值 是位于某个表某个行上的一列值.
    比如 有一个表 tab
     create table tab
    (
     pname char(20)
    )
    insert into tab (pname ) values('1234567891234567891');那么我要找一个的主键为 '1234567891234567891'
    就找到了tab 表的 pname  列.
    这一列并不一定是主键列.
      

  5.   

    有二个筛选条件
    一个是我的要选的表都在tablenames中定义了.
    二是我的类型定死了,就是char(20)的.
    所以能范围小多了.
    大致过程我想象出来,不会写.
    比如如何 判断 某个字段是char(20)类型,
    如何判断那个字段的值和我这个主键是否相等.
    如何得到某个表所有的名?
      

  6.   

    一个是我的要选的表都在tablenames中定义了
    这个是什么意思
      

  7.   

    也就是说
    create table tablenames 

    tablename varchar(50) 

    insert into tablenames values('tableA'); 
    insert into tablenames values('tableB'); 
    只要遍历tablenames表里的表名就可以了.
    如遍历上面的
    tableA
    tableB
    不需要从从系统视图中查有哪些表
      

  8.   

    create or replace procedure proc(keyword in char)
    as
    v_count number;
    begin
      for cur1 in (select table_name,column_name from user_tab_cols a where data_type='CHAR' and data_length=20
         and exists (select 1 from tablenames where upper(tablename)=a.table_name)
         and exists ( select    1   
               from    user_constraints c,user_cons_columns col   
               where    c.constraint_name=col.constraint_name 
               and  c.constraint_type='P' and col.table_name=a.table_name and col.column_name=a.column_name  ))
      loop
        execute immediate 'select count(1) from '||cur1.table_name||' where '||cur1.column_name||'='''||keyword||'''' into v_count;
        if v_count>0 then 
          dbms_output.put_line('The tablename is '||cur1.table_name||' and the column is '||cur1.column_name);
          return;
        end if;
      end loop;
      dbms_output.put_line('couldn''t found the column');
    end proc;
      

  9.   

    begin
    proc('XXX');--传入你说的主键值,output出检索的结果
    end;