【问题标题】:Pl/SQL- Get column names from a queryPl/SQL- 从查询中获取列名
【发布时间】:2013-08-02 14:57:03
【问题描述】:

我将 Pl/SQL 与 Oracle 数据库 11g 一起使用。

我正在编写一个将 select 语句作为参数 (varchar2) 的函数。该函数使用 for 循环遍历行并将格式应用于特定列,并输出整个内容。基本上,我需要一些方法来获取列名,以便可以在顶部显示它们。我知道有多种方法可以对表执行此操作,但是由于传入了此查询,因此可能未选择所有列,可能已使用别名等。

有没有办法可以从此查询中选择列名?
理想情况下是这样的:
select column_names from (subquery)

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    我相信您可以使用 DESCRIBE_COLUMNS 来执行此操作。只需传入光标和其他必需参数即可。

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm#i1026120

    declare
        v_sql varchar2(32767) := 'select 1 column1, 2 column2 from dual';
        v_cursor_id integer;
        v_col_cnt integer;
        v_columns dbms_sql.desc_tab;
    begin
        v_cursor_id := dbms_sql.open_cursor;
        dbms_sql.parse(v_cursor_id, v_sql, dbms_sql.native);
        dbms_sql.describe_columns(v_cursor_id, v_col_cnt, v_columns);
    
        for i in 1 .. v_columns.count loop
            dbms_output.put_line(v_columns(i).col_name);
        end loop;
    
        dbms_sql.close_cursor(v_cursor_id);
    exception when others then
        dbms_sql.close_cursor(v_cursor_id);
        raise;
    end;
    /
    
    Output:
    COLUMN1
    COLUMN2
    

    【讨论】:

      【解决方案2】:

      根据dseibert的回答,我创建了函数供使用:

      create type cols_name
          as table of varchar2(32767)
      /
      
      CREATE OR REPLACE FUNCTION GET_COLUMNS_NAME(p_selectQuery IN VARCHAR2) RETURN cols_name PIPELINED IS
          v_cursor_id integer;
          v_col_cnt integer;
          v_columns dbms_sql.desc_tab;
      begin
          v_cursor_id := dbms_sql.open_cursor;
          dbms_sql.parse(v_cursor_id, p_selectQuery, dbms_sql.native);
          dbms_sql.describe_columns(v_cursor_id, v_col_cnt, v_columns);
      
          for i in 1 .. v_columns.count loop
              pipe row(v_columns(i).col_name);
          end loop;
      
          dbms_sql.close_cursor(v_cursor_id);
          return;
      exception when others then
          dbms_sql.close_cursor(v_cursor_id);
          raise;
      end;
      /
      

      使用它:

      select * from TABLE(get_columns_name('select 1 column1, 2 column2 from dual'));
      

      结果:

      **COLUMN_VALUE**
      COLUMN1
      COLUMN2
      

      【讨论】:

      • 有没有办法在查询get_columns_name('select a.col1 column1, a.col2 column2 from table_test a') 中获取a.col1a.col2 的别名?
      • 抱歉,我不知道该怎么做。如果你去掉别名column1/column2,你可以收到col1/col2没有“a”的结果。
      猜你喜欢
      • 2010-09-27
      • 2018-03-13
      • 2020-10-24
      • 1970-01-01
      • 2013-08-20
      • 2019-05-28
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多