有没有办法列出 ORACLE 查询中使用的表和列?
Is there a way to list tables and columns used in a ORACLE query?
我有一个巨大的 Oracle 查询(约 2 万行),我需要列出该查询中使用的所有表和列。我已经 google 找到了一些 SQL-解析器工具和插件,但它们对我没有用。
在 perl 库下方找到,但它不处理 TO_DATE 和 TO_CHAR 列。它正在抛出错误。
http://search.cpan.org/~rehsack/SQL-Statement-1.412/lib/SQL/Parser.pm
有没有其他方法可以列出查询中使用的所有表和列?
不确定这是否是答案,但您可以使用您的查询创建一个视图。
CREATE VIEW your_view_name
AS SELECT * FROM your_table_or_complex_query;
然后使用 SYS.USER_DEPENDENCIES table 列出 table。
select *
from SYS.USER_DEPENDENCIES
where type = 'VIEW'
AND REFERENCED_TYPE IN ('VIEW', 'TABLE', 'SYNONYM')
AND name = '<view_name>';
要列出列,您可以使用下面的查询,(此查询的问题是如果列例如 COLUMN1 存在于三个 tables TAB1、TAB2、TAB3 中,但在您的查询中它只来自 TAB1,将显示三个 tables)
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;
我有一个巨大的 Oracle 查询(约 2 万行),我需要列出该查询中使用的所有表和列。我已经 google 找到了一些 SQL-解析器工具和插件,但它们对我没有用。
在 perl 库下方找到,但它不处理 TO_DATE 和 TO_CHAR 列。它正在抛出错误。
http://search.cpan.org/~rehsack/SQL-Statement-1.412/lib/SQL/Parser.pm
有没有其他方法可以列出查询中使用的所有表和列?
不确定这是否是答案,但您可以使用您的查询创建一个视图。
CREATE VIEW your_view_name
AS SELECT * FROM your_table_or_complex_query;
然后使用 SYS.USER_DEPENDENCIES table 列出 table。
select *
from SYS.USER_DEPENDENCIES
where type = 'VIEW'
AND REFERENCED_TYPE IN ('VIEW', 'TABLE', 'SYNONYM')
AND name = '<view_name>';
要列出列,您可以使用下面的查询,(此查询的问题是如果列例如 COLUMN1 存在于三个 tables TAB1、TAB2、TAB3 中,但在您的查询中它只来自 TAB1,将显示三个 tables)
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;