2015-01-20 3 views
-1

У меня есть таблица с несколькими столбцами в ней. Я хочу вернуть данные таблицы по функции вызова. В следующем я создал таблицу с некоторыми записями и также создал функцию для возврата результата запроса .Динамическое имя столбца в обратном типе

Таблица:

create table for_test 
(
cola varchar(10), 
colb varchar(10), 
name varchar(20), 
address varchar(50) 
); 

Вставка записей:

insert into for_test values('A101','B101','SAM','Munich'); 
insert into for_test values('A102','B102','AMC','Belgium'); 
insert into for_test values('A103','B103','MAM','Shanghai'); 
insert into for_test values('A104','B104','KOU','Dhaka'); 

Примечание: В функции я прошел один paramenter, который называется p_columnname в , который я проедет имя столбца между cola or colb.

ЕСЛИ я передаю имя столбца cola, он должен вернуть результат, как cola colb name.

ЕСЛИ я передаю имя колонки colb, он должен вернуть результат, как colb cola name.

Функции:

create or replace function for_test 
(
    p_columnname varchar(20) 
) 

RETURNS TABLE 
(
    _cola varchar(10), 
    _colb varchar(10), 
    _name varchar(20) 
) AS 
$$ 

DECLARE 
    v_details varchar; 
    v_query varchar; 
BEGIN 
    IF p_columnname = 'cola' THEN 

     v_details := 'cola,colb,name'; 

    ELSIF p_columnname = 'colb' THEN 

     v_details := 'colb,cola,name'; 

    ELSE 
     v_details := 'cola,colb,name'; 

    END IF; 

    v_query := 'SELECT '|| v_details ||' from for_test'; 

    RAISE INFO '%',v_query; 

    RETURN QUERY EXECUTE v_query; 

END; 

$$ 

LANGUAGE PLPGSQL; 

--Ел я прохожу ColumnName = 'кола' это покажет:

SELECT * FROM for_test('cola'); 

_cola _colb _name 
------------------- 
A101 B101 SAM 
A102 B102 AMC 
A103 B103 MAM 
A104 B104 KOU 

--Ел я прохожу имя_столбец = 'colb' это покажет:

SELECT * FROM for_test('colb'); 

_cola _colb _name 
------------------- 
B101 A101 SAM 
B102 A102 AMC 
B103 A103 MAM 
B104 A104 KOU 

Вопрос: Как изменить имя столбца в RETURN TABLE TYPE , если входной столбец изменяется с cola на colb?

+0

, что об этом 'выбрать _cola в _colb, _colb как _cola, _name из for_test ('colb');' –

+0

@WingedPanther, Что если есть длинный список столбцов? Что я должен использовать «список столбцов», как вы использовали, или '*'? Что лучше? – MAK

ответ

1

Вы можете динамически изменять тип возвращаемого путем создания type, как показано ниже

create type colb_a as (colb varchar(10), --_colb comes first 
    _cola varchar(10), 
    _name varchar(20)) 

и

create type cola_b as (cola varchar(10), -- _cola Comes first 
    _colb varchar(10), 
    _name varchar(20)) 

В TYPE вы можете определить имя столбца, который должен прийти при вызове функции или что-то еще

и введите свою функцию с этим

create or replace function for_test 
(
    _retType anyelement,p_columnname varchar(20) 
) 

RETURNS setof anyelement AS 


... 
... 

LANGUAGE PLPGSQL; 

Так что вам нужно для вызова функции вроде этого:

select * from for_test(NULL::cola_b,'cola'); 

select * from for_test(NULL::colb_a,'colb'); 
+0

Большое вам спасибо. – MAK

+1

@MAK Все самое лучшее –

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