【问题标题】:Get the tablename and columns selected using a SELECT query获取使用 SELECT 查询选择的表名和列
【发布时间】:2014-02-26 18:32:28
【问题描述】:

我有一个要求,我在表单中有查询:

select tab1.col1 as column1, tab2.col1 as column1 
from table1 tab1 inner join table2 tab2 on tab1.key1=tab2.key2

我想从中得到三样东西:

table1|col1|column1
table2|col2|comumn2

如果可能的话,我还想获取所选列的数据类型。

我知道这可以手动完成,但我有超过 2000 个选择查询,每个查询都获取超过 100 个字段。因此,这项工作变得无聊且耗时。

关于如何实现自动化的任何想法。我有 oracle SQL 开发人员,如果它适合我​​的工作,我什至可以编写 UNIX shell 脚本。

【问题讨论】:

  • 所有的查询都这么简单吗?没有子查询,没有内联查询,没有区分大小写的标识符等?确切地说,您在哪里有疑问?是否有 SQL 语句表?还是需要从存储过程中解析出SQL语句?
  • 没有查询没有这么简单。有多个连接和 where 条件,但这不应该打扰我们,因为我们只需要 select 子句中的字段。在极少数情况下,查询的 select 子句中有一些函数,例如 to_char 或 upper。所有这些查询都存储在 UNiX 的一个目录中的单独 sql 文件中(每个文件一个查询)
  • 好吧,您似乎想要来自FROM 子句的表名,因此您需要对其进行解析。您需要支持哪些 SQL 子集?内联查询?连接中的子查询?多层别名子查询?
  • 我在这里看不到任何内联查询和子查询。查询虽然简单但很大。是的,我的问题是,一旦我知道别名,如何从 FROM 子句中获取表名,以及如何找到原始列名。我想过使用 select 语句创建一个临时表,该语句将创建一个具有别名列名和数据类型的表。但是在这里我丢失了原始的表名和列名。

标签: sql unix oracle-sqldeveloper sql-parser


【解决方案1】:

您可以使用 dbms_sql 来获取结果列的描述。但它不会告诉您它来自哪个表。

但使用 dbms_sql 你可以打开光标 使用 dbms_sql.parse() 解析 sql 语句

然后您可以使用 DBMS_SQL.DESCRIBE_COLUMNS3 获取生成的列定义

例子

set serveroutput on
DECLARE
  c INTEGER;
  COL_CNT NUMBER;
  DESC_T SYS.DBMS_SQL.DESC_TAB3;
  col_desc sys.dbms_sql.desc_rec3;
BEGIN
  c := dbms_sql.open_cursor;
  dbms_sql.parse(c,'select * from dual', dbms_sql.NATIVE);

  DBMS_SQL.DESCRIBE_COLUMNS3(
      C => C,
      COL_CNT => COL_CNT,
      DESC_T => DESC_T
   );
  DBMS_OUTPUT.PUT_LINE('COL_CNT = ' || COL_CNT);

  FOR i IN   DESC_T.FIRST .. DESC_T.LAST LOOP
    col_desc := DESC_T(i);
    DBMS_OUTPUT.PUT_line(col_desc.col_name);
  END LOOP;
  SYS.DBMS_SQL.CLOSE_CURSOR(c);
END;
/

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多