代码之家  ›  专栏  ›  技术社区  ›  RRUZ

确定Oracle表中是否存在字段的快速方法

  •  7
  • RRUZ  · 技术社区  · 15 年前

    我正在寻找一个快速的SQL语句来确定表中是否存在字段。

    实际上我在用这个句子

    Select 1 
       from dual
       where exists (select 1 
                       from all_tab_columns 
                      where table_name = 'MYTABLE' 
                        and column_name = 'MYCOLUMN')
    

    我认为必须有一种最快的方法来确定Oracle中是否存在列。

    更新

    我正在优化一个更大的软件系统,它可以多次调用此查询,我不能修改源代码;(,只有我可以修改存储在外部文件中的查询。

    表的所有列都有超过一百万条记录。

    6 回复  |  直到 7 年前
        1
  •  9
  •   Vincent Malgrat    15 年前

    主键 all_tab_columns owner, table_name, column_name 所以寻找一个特定的所有者会更快(或者使用 user_tab_columns )

        2
  •  2
  •   Joseph Bui    15 年前

    我建议你读这篇asktom的文章。它解释了最快的检查方法是根本不检查。

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:698008000346356376

        3
  •  1
  •   LBushkin    15 年前

    查询Oracle数据字典——正如您的示例所做的那样,可能是最快的方法。

    数据字典缓存在内存中,应该能够很快满足查询。如果您知道表的实际模式所有者,那么您可能可以获得稍快的结果,这样就不会招致对所有模式进行搜索的成本。

        4
  •  1
  •   FerranB Tom    15 年前

    这个查询就足够了:

     SELECT null
      FROM user_tab_columns
     WHERE table_name = 'MYTABLE' and column_name = 'MYCOLUMN'
    

    唯一最快的方法是直接从内部表查询 不是推荐的方式 您需要对sys对象授予权限:

    select null
    from sys.col$ c
       , sys.obj$ o
       , sys.obj$ ot
    where o.name = 'MYTABLE'
      and c.name = 'MYCOLUMN'
      and o.obj# = c.obj#
      and o.owner# = userenv('SCHEMAID')
      and ot.type#(+) = 13
      and (o.type# in (3, 4)                                    
           or
           (o.type# = 2 
            and
            not exists (select null
                          from sys.tab$ t
                         where t.obj# = o.obj#
                           and (bitand(t.property, 512) = 512 or
                                bitand(t.property, 8192) = 8192))))
    

    此查询取自 USER_TAB_COLUMNS 定义和 它可以在不同的版本上改变(我的案例中是10GR2) . 在这个问题上,我删去了对你没有要求的信息的引用。

    不管怎样,你为什么要检查这个?

        5
  •  0
  •   Ranveer Singh    9 年前

    此SQL查询将为用户“dsgidev”提供具有“navigation\u id”列的所有表的名称

    从所有选项卡列中选择*,其中列名为“导航ID”,所有者为“dsgidev”

    因此,使用要搜索的列更改列名,使用所有者ID名称更改所有者。

        6
  •  0
  •   Summer23 HV    7 年前

    EZ,最快的方法就是创建这样的函数:

      Create function exist(v_table in varchar2, v_col in  varchar2) 
     Return integer is
     Res integer:= 0;
     Begin
       Begin
          Execute immediate 'select ' || v_col || ' from '|| v_table;         
          Res:=1;
          Exception when other then null;
       End;
    Return (res);
    End;
    
    推荐文章