PostgreSQL:查询结构与使用多态类型“anyelement”的函数结果类型不匹配

时间:2014-04-03 10:08:27

标签: postgresql plpgsql polymorphism

问题:使用多态类型“anyelement”从表中返回选定的行时出错。

错误:查询结构与函数结果类型不匹配。

---表

CREATE TABLE tes1
(
    rollno integer,
    fname text,
    lname text,
    age integer,
    branch text,
    phno integer,
    email text,
    address text,
    city text,
    state text,
    country text
)

---功能

create or replace function fun_test(column_name varchar,relation_name anyelement)
returns setof anyelement as
$body$
declare
        str varchar;
        grouping varchar;
        additional_column varchar;
        select_query varchar;
begin
       if column_name='fname' then
               str:=quote_ident(column_name);
               additional_column:=' max("address") as addr, max("city") as cty, max("state") as st, max("country") as cntry';
           grouping:='"rollno"'||','||quote_ident(column_name);
   else
           str:=quote_ident(column_name);
           additional_column:=' max("address") as addr, max("city") as cty, max("state") as st, max("country") as cntry';
           grouping:='"rollno"'||','||quote_ident(column_name);
   end if;

   select_query:= 'select rollno,'||str||','||additional_column||' from '||pg_typeof(relation_name)||
   ' group by '|| grouping;

   raise info '%',select_query;

   return query execute select_query;
end;
$body$
language plpgsql;

---调用函数

 select * from fun_test('fname',NULL::test)

2 个答案:

答案 0 :(得分:3)

也许是一个简单的拼写错误?

CREATE TABLE tes1
...

select * from fun_test('fname',NULL::test)

关于评论的后续行动

  

错误详细信息:返回的类型文本与第4列中的预期类型整数不匹配

错误信息非常明显。您需要将SELECT语句中的第4个值转换为integer或在类型定义中使用text。在当前函数中,定义的类型与返回的内容之间存在更多不匹配。

答案 1 :(得分:0)

不确定,但似乎当您返回多个列时,返回类型应设置为记录。

 create or replace function fun_test(column_name varchar,relation_name anyelement)
 returns setof record as
 ...