有没有办法列出ORACLE查询中使用的表和列?

时间:2018-03-17 17:52:36

标签: oracle perl query-parser

我有一个巨大的Oracle查询(~20k行),我需要列出该查询中使用的所有表和列。我已经google'd并发现了一些SQL-Parser工具和插件,但它们并没有给我带来帮助。

在perl库下面找到,但它没有处理TO_DATE和TO_CHAR列。这是投掷错误。

http://search.cpan.org/~rehsack/SQL-Statement-1.412/lib/SQL/Parser.pm

有没有其他方法可以列出查询中使用的所有表格和列?

1 个答案:

答案 0 :(得分:2)

不确定这是否是答案,但您可以使用查询创建VIEW。

CREATE VIEW your_view_name
AS SELECT * FROM your_table_or_complex_query;

然后使用SYS.USER_DEPENDENCIES表列出表。

select *
  from SYS.USER_DEPENDENCIES
 where type = 'VIEW'
   AND REFERENCED_TYPE IN ('VIEW', 'TABLE', 'SYNONYM')
   AND name = '<view_name>';

要列出列,您可以使用下面的查询,(此查询的问题是,例如COLUMN1的列是否存在于三个表TAB1,TAB2,TAB3中,但在您的查询中它只来自TAB1,这三个表将会显示)

SELECT a.referenced_name, b.column_name
  FROM SYS.USER_DEPENDENCIES A, USER_TAB_COLS B, 
       (SELECT dbms_metadata.get_ddl('VIEW','<view_name>','<schema_name>') ddl_text FROM DUAL) c
 WHERE TYPE = 'VIEW'
   AND REFERENCED_TYPE IN ('VIEW', 'TABLE', 'SYNONYM')
   AND name = '<view_name>'
   AND b.table_name = a.name
   AND INSTR(lower(c.ddl_text), lower(b.column_name)) > 0
   ORDER BY referenced_name;