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 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.
Is there a way I can select out the column names from this query?
Ideally something like:
select column_names from (subquery)
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
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.