【问题标题】:How to find the table/view names and corresponding projected column names in a SQL query [closed]如何在 SQL 查询中查找表/视图名称和相应的投影列名称 [关闭]
【发布时间】:2020-10-31 20:34:08
【问题描述】:

我们正在构建一个用户选择数据源并构建 SQL 的应用程序

  1. 使用我们的 SQL 查询构建器或
  2. 将现有 SQL 粘贴到应用中。

这个应用程序的一个要求是获取一些表/视图列属性,包括数据类型和大小、精度等。如果用户使用选项#1 SQL查询生成器,那么我们将知道该列通过从 DB 进行自省的属性;但是,如果用户选择选项 #2,即粘贴现有 SQL,那么我们将需要解析 SQL,然后找出所有 SELECT(projected) 列的所需属性。问题是,如何实现这个目标:

  1. 从粘贴的 SQL 中找出表/视图和对应的投影列名。

我们在后端使用 java 并且更喜欢 java 库,但如果 java 中不存在执行上述 2 个功能的其他语言库,我们将向其他语言库开放。从this,我看到有几个库,但我不知道这些库/工具中的哪些可以帮助获取表/视图名称和相应的列名,以便我可以自省数据库并找到所需的属性。

虽然我们的应用程序适用于所有数据库,但目前,我们的客户使用 MySQL 和 Oracle。因此,这些库现在应该能够解析这两个数据库。

我意识到我可以使用 ANTLR 为 MySQL 和 Oracle 构建解析器,但我不知道为实际 SQL 构建解析器需要多少时间。

希望提供有关哪种方法和工具可以更快实现目标的指针。

我们的前端使用 React,后端使用 Java,如果有帮助的话。

【问题讨论】:

    标签: java mysql sql oracle parsing


    【解决方案1】:

    有两种标准方式:

    1 使用 dbms_sql.parse + dbms_sql.describe_columns:https://www.got-it.ai/solutions/sqlquerychat/sql-help/others/dbms_sql-basics-describe_columns-method/

    2 执行“解释计划”并从plan_table中选择:

    explain plan SET STATEMENT_ID = 'PLAN1' for select * from dual;
    
    select object_type, object_owner, object_name, projection, search_columns, access_predicates, filter_predicates
    from plan_table 
    where statement_id='PLAN1'
    and object_type is not null;
    

    显然,您可以结合使用这些方法以及 all_tables/all_tab_columns。

    如果您还需要分析使用的用户视图及其来源,可以使用 dbms_utility.expand_sql_text:https://oracle-base.com/articles/12c/expand-sql-text-12cr1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多