PostgreSQL存储过程返回表的所有列

11
创建了一个函数,该函数有一个输入参数。我可以返回一列,但我想返回所有表列。并且,如果结果为零,则函数只返回 0。如何实现?
这里是错误的结果。
``` ERROR: query has no destination for result data HINT: If you want to discard the results of a SELECT, use PERFORM instead. CONTEXT: PL/pgSQL function dwgcould.returnallcolumns(character varying) line 3 at SQL statement ```
CREATE OR REPLACE FUNCTION dwgcould.returnallcolumns(IN sessionId character varying)
  RETURNS SETOF public.mytable AS
$BODY$
BEGIN
    SELECT * FROM public.mytable WHERE session_id=returnallcolumns.sessionId ORDER BY pro_id DESC LIMIT 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

你遇到了什么错误?但是“我想返回所有表列”与“函数只返回0”相矛盾,你不能在一种情况下返回“所有列”,而在其他情况下只返回一列。 - user330315
如果没有结果返回值将为0。这不可能吗? - Fatih
它似乎能够做你想要的事情。它是稳定的,不是易挥发的。 - Clodoaldo Neto
2个回答

23
如果您想返回结果,在PL/pgSQL中需要使用return query,正如手册中所述
CREATE OR REPLACE FUNCTION dwgcould.returnallcolumns(IN sessionId character varying)
  RETURNS SETOF public.mytable AS
$BODY$
BEGIN
  return query --<< this was missing
    SELECT * 
    FROM public.mytable 
    WHERE session_id = returnallcolumns.sessionId 
    ORDER BY pro_id DESC LIMIT 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

但是你不需要使用PL/pgSQL,一个简单的SQL函数将更加高效:

CREATE OR REPLACE FUNCTION dwgcould.returnallcolumns(IN sessionId character varying)
  RETURNS SETOF public.mytable AS
$BODY$
    SELECT * 
    FROM public.mytable 
    WHERE session_id = returnallcolumns.sessionId 
    ORDER BY pro_id DESC LIMIT 1;
$BODY$
LANGUAGE sql;

非常感谢您。 - Fatih
这会返回一个名为“mytable”的单列。在该列中,所有值都用逗号分隔。如何获取包含所有列的结果,就像表格一样? - balron
2
@balron:你使用了 select * from returnallcolumns(...) 吗? - user330315
@a_horse_with_no_name 不,最终我注意到我需要查询为 select * from ...,谢谢 :) - balron
如何获取传递参数为动态表名的所有数据? - Prashant Girase

0
如何从以参数形式传递的PostgreSQL数据库中的动态表中获取所有数据?
DROP FUNCTION IF EXISTS schemaName."GetAllDataFromDynamicTable";

CREATE OR REPLACE FUNCTION schemaName."GetAllDataFromDynamicTable"(IN P_DynamicTableName text)
    RETURNS SETOF schemaName."P_DynamicTableName" 
AS $$
BEGIN
  return query
    SELECT *
    FROM schemaName."P_DynamicTableName" -- this table name every time change
END;
$$
LANGUAGE plpgsql;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接