【问题标题】:Excluding MDRT% tables from ALL_TABLES view in Oracle从 Oracle 的 ALL_TABLES 视图中排除 MDRT% 表
【发布时间】:2015-07-23 09:08:03
【问题描述】:

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

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 数据库中都存在类似的表(在 12c 上也注意到了)。稍微搜索一下这些表的内容,就会发现它们是由 Oracle 在创建空间索引时创建的。我查看了all_tables 的架构,看看我是否可以使用任何列来尝试排除这些额外的表,但没有成功。

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

【问题讨论】:

  • 您是在询问如何将它们从视图中排除,而不仅仅是从您的查询中排除(使用and table_name not like 'MDRT%')?
  • 哦,不。我不想以任何方式修改数据。我只需要向连接的用户显示他在我的应用程序中拥有的所有表。我需要以某种方式隐藏这些额外的表格。我确实尝试过使用 not LIKE,它适用于我的测试数据,但其他一些数据库中的名称以 MDXT 而不是 MDRT 开头。我只是想在这里找到一个更通用的解决方案。当然,我必须回退到 MD%,否则没有其他办法。
  • 不知道为什么会有索引表,或者索引会出现在这个视图中;但我没有合适的版本或任何空间背景可供参考。但是,这些也出现在all_sdo_index_info 中吗?如果是这样,您可以使用它来排除它们,也许。
  • 是的,@AlexPoole,创建这些表是为了存储/管理用于空间索引的 R-tree 索引的节点级别。 SDO 空间索引的创建索引语法包括存储参数,但不包括物理表名(不幸的是)。而且,是的,这些都包含在 all_sdo_index_info(或 user_sdo_index_info)中。

标签: sql oracle


【解决方案1】:

正如@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 */
;

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2012-02-08
    • 2014-05-24
    相关资源
    最近更新 更多