【问题标题】:PostgreSQL: Structure of query does not match function result type using polymorphic type "anyelement"PostgreSQL:查询结构与使用多态类型“anyelement”的函数结果类型不匹配
【发布时间】:2014-04-04 22:55:35
【问题描述】:

问题:使用多态类型“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)

【问题讨论】:

    标签: postgresql plpgsql polymorphism


    【解决方案1】:

    也许是一个简单的错字?

    CREATE TABLE tes1
    ...
    
    select * from fun_test('fname',NULL::test)
    

    至于评论中的后续

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

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

    【讨论】:

    • test 而不是 tes1 是输入错误。但错误仍然相同。
    • 错误详情:返回的类型文本与第 4 列中的预期类型整数不匹配。
    • 哦!我知道了。所以我需要给所有的列,显示所需的列是不可能的?
    【解决方案2】:

    不确定,但似乎由于您返回的列不止一列,因此返回类型应该是记录集。

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

    【讨论】:

    • @INait,是的!我也试过了。但没有得到预期的解决方案。
    • @INait,我想调用没有列定义列表的函数,如上例所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多