2013-08-02 3 views
4

Я использую Pl/SQL с Oracle Database 11g.Pl/SQL- Получить имена столбцов из запроса

Я пишу функцию, которая принимает оператор select в качестве параметра (varchar2). Функция использует цикл for для перемещения по строкам и применения форматирования к определенным столбцам и выводит все это. В принципе, мне нужно каким-то образом получить имена столбцов, чтобы я мог отображать их вверху. Я знаю, что для таблиц существует несколько способов сделать это, но поскольку этот запрос передан, все столбцы могут быть не выбраны, могут быть использованы псевдонимы и т. Д.

Есть ли способ, которым я могу выбрать столбец имена из этого запроса?
В идеале что-то вроде:
select column_names from (subquery)

ответ

9

Я считаю, что вы можете использовать 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 
3

на основе dseibert «s ответ, я создал функцию для использования:

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 
+0

Есть ли способ получить значения 'a.col1' или' a.col2' с псевдонимом в запросе 'get_columns_name ('select a.col1 column1, a.col2 column2 from table_test a')'? – Joaquinglezsantos

+0

Извините, я не знаю, как это сделать. Если вы удалите псевдоним column1/column2, вы можете получить результат col1/col2 без «a». – Joe

Смежные вопросы