函数定义
create or replace function fun_seletall()
returns setof record as
$$
begin
return query select * from e_info order by e_id;
end;
$$
language 'plpgsql' volatile
cost 100
rows 1000;函数执行
select fun_selectall();错误提示
set-valued function called in context that cannot accept a set

解决方案 »

  1.   

    postgresql与其它的数据库有点区别,示例:
    CREATE FUNCTION dt1() RETURNS SETOF record AS $$
    declare r record;
    ff varchar:='SELECT "A",';
    begin
    for r in select distinct "B" from tth1 loop
    ff:=ff || 'max(case when "B"='''||r."B" || '''' || ' then "C" ' || ' end ),';
    RAISE NOTICE '123(%)', ff;
    end loop;
    ff:=substr(ff,1,length(ff)-1) || ' from tth1 group by "A"';
    FOR r IN execute ff Loop   
            RETURN NEXT r;
        END LOOP;
    end;
    $$ LANGUAGE plpgsql;select * from dt1() a(q text,d float,e float,f float);
    要将字段名、类型写上
      

  2.   

    哈哈,原来是postgresql.难怪看不懂了.
      

  3.   

    给你一个最简单的例子:
    你照着改改就行了。
    CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
    INSERT INTO foo VALUES (1, 2, 'three');
    INSERT INTO foo VALUES (4, 5, 'six');CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS
    $BODY$
    DECLARE
        r foo%rowtype;
    BEGIN
        FOR r IN SELECT * FROM foo
        WHERE fooid > 0
        LOOP
            -- can do some processing here
            RETURN NEXT r; -- return current row of SELECT
        END LOOP;
        RETURN;
    END
    $BODY$
    LANGUAGE 'plpgsql' ;SELECT * FROM getallfoo();
      

  4.   

    怎么能让输出的字段分开啊,我想让他的返回结果像selet * from e_id执行后一样