2

I could not find all tables equivalent in oracle. Such as;

sys.index_columns
sys.columns
sys.foreign_key_columns

Is there any list to find out these table names? We have several queries in mssql and they are needed to be convert for oracle.

Martin Schapendonk
  • 12,893
  • 3
  • 19
  • 24
unbalanced
  • 1,192
  • 5
  • 19
  • 44

3 Answers3

3

You are looking for the 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

Instead of user_ (which is restricted to objects in your own schema), you could also use all_ for all objects you have access to or dba_ for all objects in the database (provided you have DBA authorisation).

Martin Schapendonk
  • 12,893
  • 3
  • 19
  • 24
  • thank you so much for your reply. But I still need some detail. For example in mssql, sys.indexes has "has_filter" column.. but in oracle, there is not such name filter column.. I checked also dictionary list but havent seen anything about it. – unbalanced Aug 24 '16 at 13:31
  • That is because filtered indexes do not exist in Oracle :-) – Martin Schapendonk Aug 24 '16 at 13:45
3

The data dictonary tables are documented. See Static Data Dictionary Views

You are probably looking for the tables:

  • ALL_IND_COLUMNS
  • ALL_TAB_COLUMNS
  • ALL_CONS_COLUMNS
Codo
  • 75,595
  • 17
  • 168
  • 206
1

If that's any help, here's the SQL templates that I use in a "database browser" I built. It adapts itself following the RDBMS of the chosen database, and returns the exact same data into the application.

Here you have the queries to get:

  • the table and views list, including number of rows from the stats table.
  • the structure of a table, including indexed columns

Tables/Views List

SQL SERVER :

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

ORACLE

(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

Table Structure (cols and basic idx)

SQL SERVER

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

ORACLE

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
Thomas G
  • 9,886
  • 7
  • 28
  • 41