簡體   English   中英

Pl / SQL-從查詢中獲取列名

[英]Pl/SQL- Get column names from a query

我正在使用Pl / SQL和Oracle Database 11g。

我正在編寫一個函數,它將select語句作為參數(varchar2)。 該函數使用for循環遍歷行並將格式應用於特定列,並輸出整個事物。 基本上,我需要一些方法來獲取列名稱,以便我可以在頂部顯示它們。 我知道有多種方法可以為表執行此操作,但由於傳入此查詢,因此可能未選擇所有列,可能已使用別名等。

有沒有辦法從這個查詢中選擇列名?
理想情況如下:
select column_names from (subquery)

我相信你可以使用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

根據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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM