在 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()
SQL 中的 STUFF 等效函数(MySQL 中的 GROUP_CONCAT / Oracle 中的 LISTAGG)