使用SELECT查询获取选择的表名和列

时间:2014-02-26 18:32:28

标签: sql unix oracle-sqldeveloper sql-parser

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

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脚本。

1 个答案:

答案 0 :(得分:0)

您可以使用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;
/