我有一个包含多列的表。我想回复一下细节 通过调用函数的表。在下面我创建了表 一些记录并且还创建了返回select结果的函数 言。
表格:
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');
注意:在函数中,我传递了一个名为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 =' cola'这将显示:
SELECT * FROM for_test('cola');
_cola _colb _name
-------------------
A101 B101 SAM
A102 B102 AMC
A103 B103 MAM
A104 B104 KOU
- 如果我通过columnname =' 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 :(得分: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');