从Oracle中的ALL_TABLES视图中排除MDRT%表

时间:2014-09-10 11:55:13

标签: sql oracle

我正在尝试使用以下查询检索特定架构中的所有表:

SELECT OWNER || '.' || TABLE_NAME
  from sys.all_tables
 where secondary = 'N' and owner = 'TEST'

这个查询对我来说非常合适,直到今天我才意识到同一个查询在11.2.0.3和更高版本的Oracle之间表现不同。从Oracle 11.2.0.4开始,相同的查询也会返回一些额外的表,所有表都以名称MDRT开头。

我已经验证了11.2.0.3和11.2.0.4 DB中都存在类似的表(在12c上也注意到它)。关于这些表的内容,有点谷歌搜索,他们是在创建空间索引时由Oracle创建的。我查看了all_tables的模式,看看我是否可以使用任何列来尝试排除这些额外的表没有成功。

最令人惊讶的是,我在SO或Oracle论坛上找不到任何关于此问题的文章。这很烦人。

1 个答案:

答案 0 :(得分:0)

正如@AlexPoole所解释的那样,可以通过名称排除这些MDRT表。以下是帮助您(和其他人)解决此问题的一个具体示例:

    SELECT 
         AT.OWNER || '.' || AT.TABLE_NAME
    from 
          sys.all_tables AT,
          MDSYS.all_sdo_index_info SI   /* here are the sdo_index details */
 where 
        AT.secondary = 'N' 
    and AT.owner = 'TEST'
    and AT.owner = SI.sdo_index_owner(+)      /* optionally match schema  */
    and AT.table_name = SI.sdo_index_table(+) /* optionally match table   */
    and SI.sdo_index_table is null            /* force no results from SI */
;