【问题标题】:PostgreSQL: return a select statement in a procedurePostgreSQL:在过程中返回一个选择语句
【发布时间】:2014-01-22 11:03:10
【问题描述】:

是否有任何从 MSSQL 到 PostgreSQL 的等效项来返回 select 语句(结果可能来自不同的表)? 在 MSSQL 中是这样的:

CREATE PROCEDURE MyProc
AS
BEGIN
   SELECT * FROM MyTable
END

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

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

但是我想要做的是从一个由参数传递的表中返回结果(当然我的过程更复杂,我的意图为什么这样做并不那么简单,这只是一个抽象)。

【问题讨论】:

  • 问题不在于表名的传递,问题在于结果集的定义。 Postgres 要求在编译时定义返回的结果(使用returns setof 或returns table 时)。我认为这样做的唯一方法是使用带有引用光标的函数。
  • 嗯,这有点可惜,但我怀疑它。我将尝试使用光标,这是个好主意,所以我会将其作为结果提供给 php.ini。把它写成答案,所以我会把它作为接受的答案
  • @a_horse_with_no_name cursor 做到了。花了我一点时间如何用 PHP 处理光标(并将其转换为数组),但它有效。谢谢!请写下您的评论作为答案,以便我接受。

标签: postgresql stored-procedures plpgsql dynamic-sql postgresql-9.2


【解决方案1】:

在Postgres中比较复杂,不过有polymorphic types的办法:

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");

此相关答案中的详细说明(参见最后一段:各种完整的表格类型):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2010-10-03
    • 2012-12-12
    相关资源
    最近更新 更多