7

我正在寻找一个快速的 sql 语句来确定表中何时存在或不存在字段。

其实我在用这句话

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

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

更新

我正在优化一个更大的软件系统,该系统对该查询进行多次调用,我无法修改源代码;(,只有我可以修改存储在外部文件中的查询。

表 all_tab_columns 有超过一百万条记录。

4

6 回答 6

9

的主键all_tab_columnsowner, table_name, column_name这样寻找特定的所有者会更快(或使用user_tab_columns)。

于 2010-02-16T21:05:54.963 回答
2

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

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

于 2010-02-16T21:10:37.840 回答
1

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

数据字典缓存在内存中,应该能够很快满足查询。如果您知道表的实际架构所有者,您可能能够获得稍快的结果 - 这样您就不会产生针对所有架构进行搜索的成本。

于 2010-02-16T21:06:19.727 回答
1

这个查询就足够了:

 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)。在此查询中,我已删除对您未要求的信息的引用。

无论如何,你为什么要检查这个?

于 2010-02-16T21:22:17.753 回答
0

此 SQL 查询将为用户 'DSGIDEV' 提供具有列 'NAVIGATION_ID' 的所有表的名称

select * from all_tab_cols where column_name = 'NAVIGATION_ID' and owner = 'DSGIDEV'

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

于 2016-01-05T08:57:52.313 回答
0

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;
于 2018-08-22T03:48:20.947 回答