oracle Pl/SQL- 从查询中获取列名

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18020060/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 01:50:09  来源:igfitidea点击:

Pl/SQL- Get column names from a query

sqloracleplsql

提问by bobroxsox

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

我在 Oracle 数据库 11g 中使用 Pl/SQL。

I'm writing a function that takes in a select statement as a parameter (varchar2). The function uses a for loop to go over the rows and apply formatting to specific columns, and output the whole thing. Basically, I need some way to get the column names so that I can display them at the top. I know there are various ways to do this for tables, but since this query is passed in, all columns may not have been selected, aliases may have been used, etc.

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

Is there a way I can select out the column names from this query?
Ideally something like:
select column_names from (subquery)

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

回答by dseibert

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

我相信你可以使用 DESCRIBE_COLUMNS 来做到这一点。只需传入游标和其他必需的参数。

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

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

回答by Phi

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

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

Using it:

使用它:

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

Results:

结果:

**COLUMN_VALUE**
COLUMN1
COLUMN2