在 Oracle 中等效于 Ms Sql sys 表

Posted

技术标签:

【中文标题】在 Oracle 中等效于 Ms Sql sys 表【英文标题】:Ms Sql sys tables equivelant in Oracle 【发布时间】:2016-08-24 13:12:37 【问题描述】:

我在 oracle 中找不到所有等效的表。 比如;

sys.index_columns
sys.columns
sys.foreign_key_columns

有没有找到这些表名的列表?我们在 mssql 中有几个查询,需要将它们转换为 oracle。

【问题讨论】:

【参考方案1】:

您正在寻找Oracle Data Dictionary。

MS SQL                      Oracle
------------------------    ------------------------------------------
sys.index_columns           user_indexes      and  user_ind_columns
sys.columns                 user_tab_cols
sys.foreign_key_columns     user_constraints  and  user_cons_columns

除了user_(仅限于您自己架构中的对象)之外,您还可以将all_ 用于您有权访问的所有对象,或者将dba_ 用于数据库中的所有对象(前提是您具有DBA 授权)。

【讨论】:

非常感谢您的回复。但我仍然需要一些细节。例如在 mssql 中,sys.indexes 有“has_filter”列。但在 oracle 中,没有这样的名称过滤列。我还检查了字典列表,但没有看到任何相关信息。 那是因为Oracle中不存在过滤索引:-)【参考方案2】:

数据字典已记录在案。见Static Data Dictionary Views

您可能正在寻找表格:

ALL_IND_COLUMNS ALL_TAB_COLUMNS ALL_CONS_COLUMNS

【讨论】:

【参考方案3】:

如果有任何帮助,这里是我在我构建的“数据库浏览器”中使用的 SQL 模板。它会根据所选数据库的 RDBMS 进行自我调整,并将完全相同的数据返回到应用程序中。

这里有查询:

表和视图列表,包括统计表中的行数。 表的结构,包括索引列

表/视图列表

SQL 服务器:

SELECT ta.tname, sc.name AS owner, ta.ttype, SUM(pa.rows) RowCnt
 FROM
 (
     SELECT 'T' AS ttype, object_id, schema_id, name AS tname
     FROM sys.tables 
     WHERE is_ms_shipped = 0 AND name LIKE  '%table_name_whatever%' 
     UNION ALL
      SELECT 'V' AS ttype, object_id, schema_id, name AS tname
     FROM sys.views 
     WHERE is_ms_shipped = 0  AND name LIKE  '%table_name_whatever%'
) ta
LEFT JOIN sys.partitions pa ON pa.OBJECT_ID = ta.OBJECT_ID AND pa.index_id IN (1,0)
LEFT JOIN sys.schemas sc ON ta.schema_id = sc.schema_id
GROUP BY ta.tname, sc.name, ta.ttype
ORDER BY ta.tname

甲骨文

(SELECT table_name as tname, owner, 'T' AS ttype, NUM_ROWS AS RowCnt FROM all_tables WHERE table_name LIKE  '%table_name_whatever%') 
UNION ALL  
(SELECT view_name as tname, owner, 'V' AS ttype, NULL AS RowCnt FROM all_views WHERE view_name LIKE  '%table_name_whatever%') ORDER BY tname

表结构(cols 和基本 idx)

SQL 服务器

SELECT c.name as column_name, ty.name AS type_name, c.max_length AS col_len,
    (CASE 
        WHEN (i.name IS NOT NULL AND i.is_unique=1) THEN 'U'
        WHEN (i.name IS NOT NULL AND i.is_unique=0) THEN 'X'
        ELSE '' 
    END) AS idx,
    '' as comments
FROM sys.columns c
INNER JOIN sys.objects o                ON o.object_id=c.object_id  
INNER JOIN sys.types ty         ON c.system_type_id = ty.system_type_id AND ty.name<>'ID_Code'
LEFT  JOIN sys.index_columns ic ON o.object_id = ic.object_id AND ic.column_id = c.column_id
LEFT  JOIN sys.indexes i                ON o.object_id = i.object_id AND i.index_id = ic.index_id 
WHERE o.name = 'table_name_whatever' 
ORDER BY C.column_id

甲骨文

SELECT  t.column_name, t.data_type as type_name, t.data_length as col_len, 
                (CASE 
                    WHEN b.uniqueness='UNIQUE' THEN 'U' 
                    WHEN b.uniqueness='NONUNIQUE' THEN 'X' 
                    ELSE '' 
              END) AS idx,
              c.comments
FROM all_tab_columns t
LEFT JOIN all_col_comments c ON c.table_name=t.table_name AND c.column_name = t.column_name
LEFT JOIN all_ind_columns a  ON a.table_name=t.table_name AND a.column_name = t.column_name
LEFT JOIN all_indexes b      ON a.index_name=b.index_name 
WHERE t.table_name='table_name_whatever' 
ORDER BY t.column_ID

【讨论】:

谢谢你的代码,我可能会在那里看到一些东西。但例如什么相当于 sysindex 表中的 has_filter 列.. 我不是 DBA,只是一个开发人员 ;-) 在这里问其他人

以上是关于在 Oracle 中等效于 Ms Sql sys 表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 等效于 information_schema.tables

等效于 JavaScript 中 Python 的 sys.exit()

Oracle 等效于 Java 的 Varargs

此 Access 查询的 MS SQL 等效项是啥?

来自oracle sql的等效redshift sql

SQL 中的 STUFF 等效函数(MySQL 中的 GROUP_CONCAT / Oracle 中的 LISTAGG)