PostgreSQL:在存储过程中返回一个select语句

3

是否有与MSSQL等效的PostgreSQL语句返回一个select查询(其结果可以来自不同的表)? 在MSSQL中,代码如下:

CREATE PROCEDURE MyProc
AS
BEGIN
   SELECT * FROM MyTable
END

在MSSQL中,MyTable可以是任何表格,但在PostgreSQL中,我必须定义要从哪个表格返回数据。就像这样:

CREATE FUNCTION MyFunction ()
RETURNS setof "MyTable" AS $$
BEGIN
  RETURN QUERY SELECT * FROM "MyTable"
END;
$$ LANGUAGE plpgsql;

但是我想做的是从一个通过参数传递的表格中返回结果(当然我的过程更加复杂,我这么做的意图并不简单,这只是一个抽象的例子)。


1
问题不在于传递表名,而在于结果集的定义。Postgres要求在编译时(使用returns setofreturns table时)定义返回结果。我认为唯一的方法是使用带有引用游标的函数。 - user330315
请参考此链接:http://stackoverflow.com/questions/16452844/postgres-dynamic-sql-and-list-result - user330315
嗯,有点遗憾,但我已经怀疑了。我会尝试使用游标,这是个好主意,所以我会将其作为结果返回给 PHP。请将其写成答案,这样我就会接受它作为正确答案。 - kinske
@a_horse_with_no_name 光标就是这样。我花了一点时间学习如何使用PHP处理光标(并将其转换为数组),但它确实起作用了。谢谢! - kinske
1个回答

3

在Postgres中更为复杂,但是有一种方法是通过多态类型

CREATE OR REPLACE FUNCTION f_data_of(_tbl_type anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN

RETURN QUERY EXECUTE 'SELECT * FROM ' || pg_typeof(_tbl_type);

END
$func$ LANGUAGE plpgsql;

重要提示:拨打电话:

SELECT * FROM f_data_of(NULL::"MyTable");

这个相关答案中有详细的解释(请看最后一段:各种完整表类型):


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