我正在使用Pl / SQL和Oracle Database 11g。
我正在编写一个将select语句作为参数(varchar2)的函数。该函数使用for循环遍历行并将格式应用于特定列,并输出整个事物。基本上,我需要一些方法来获取列名称,以便我可以在顶部显示它们。我知道有很多种方法可以为表执行此操作,但由于传入了此查询,因此可能未选择所有列,可能已使用别名等。
有没有办法可以从这个查询中选择列名?
理想情况如下:
select column_names from (subquery)
答案 0 :(得分:10)
我相信您可以使用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
答案 1 :(得分:3)
根据 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