Pl/SQL- Get column names from a query

后端 未结 2 2020
再見小時候
再見小時候 2021-02-06 11:12

I\'m using Pl/SQL with Oracle Database 11g.

I\'m writing a function that takes in a select statement as a parameter (varchar2). The function uses a for loop to go over

相关标签:
2条回答
  • 2021-02-06 11:36

    I believe you can use DESCRIBE_COLUMNS to do this. Just pass in the cursor and the other required parameters.

    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
    
    0 讨论(0)
  • 2021-02-06 11:46

    Based on dseibert's answer, I created function for usage:

    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;
    /
    

    Using it:

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

    Results:

    **COLUMN_VALUE**
    COLUMN1
    COLUMN2
    
    0 讨论(0)
提交回复
热议问题