从PostgreSQL函数返回行集

从PostgreSQL函数返回行集,postgresql,plpgsql,dynamic-sql,postgresql-9.2,Postgresql,Plpgsql,Dynamic Sql,Postgresql 9.2,我想返回两个视图之间的连接。这是很多专栏。这在SQLServer中非常简单。但在PostgreSQL中,当我加入时。我得到错误“需要列定义列表” 我不想提供返回列的定义 CREATE OR REPLACE FUNCTION functionA(username character varying DEFAULT ''::character varying, databaseobject character varying DEFAULT ''::character varying) RETU

我想返回两个视图之间的连接。这是很多专栏。这在SQLServer中非常简单。但在PostgreSQL中,当我加入时。我得到错误“需要列定义列表”

我不想提供返回列的定义

CREATE OR REPLACE FUNCTION functionA(username character varying DEFAULT ''::character varying, databaseobject character varying DEFAULT ''::character varying)
  RETURNS SETOF ???? AS
$BODY$
Declare 
SqlString varchar(4000) = '';
BEGIN
IF(UserName = '*') THEN
   Begin
   SqlString  := 'select * from view1 left join ' + databaseobject  + ' as view2 on view1.id = view2.id';
   End;
ELSE
    Begin
    SqlString := 'select * from view3 left join ' + databaseobject  + ' as view2 on view3.id = view2.id';
    End;
END IF; 
execute (SqlString  );
END;
$BODY$
消毒功能 您当前拥有的可简化/消毒为:

创建或替换函数func_a(用户名文本=“”,数据库对象文本=“”)
返回????
语言plpgsql AS
$func$
开始
返回查询执行
格式化('使用(id)从%s v1左联接%I v2中选择*)
,当用户名='*'然后是'view1'或'view3'结束时为大小写
,数据库对象);
结束
$func$;
您只需要的其他实例就可以使用它们自己的作用域启动单独的代码块,这是很少需要的

标准的SQL连接运算符是
|
<代码>+是您以前的供应商的“创造性”补充

除非你重复引用,否则不要使用。最好不要使用它们,请参见:

varchar(4000)
还针对SQL Server的特定限制进行了定制。它在研究生中没有特殊意义。如果您实际需要4000个字符的限制,请仅使用
varchar(4000)
。我只想使用-除了在简化函数之后,我们根本不需要任何变量

如果尚未使用
format()
,则

返回类型 现在,针对您的实际问题:动态查询的返回类型可能很棘手,因为SQL要求最迟在调用时声明该类型。如果数据库中的表、视图或复合类型已与列定义列表匹配,则可以使用该类型:

CREATE FUNCTION foo()
  RETURNS SETOF my_view AS
...
否则,将列定义列表中的out与(最简单的)
返回表一起拼写:

CREATE FUNCTION foo()
  RETURNS TABLE (col1 int, col2 text, ...) AS
...
如果您正在进行行类型设置,则可以返回匿名记录:

CREATE FUNCTION foo()
  RETURNS SETOF record AS
...
但是每次调用都必须提供一个列定义列表,所以我很少使用它

我不会使用
SELECT*
作为开始。使用确定的列列表返回并相应地声明您的返回类型:

创建或替换函数func_a(用户名文本=“”,数据库对象文本=“”)
返回表(col1 int、col2 text、col3 date)
语言plpgsql AS
$func$
开始
返回查询执行
格式($f$SELECT v1.col1、v1.col2、v2.col3)
从%s v1使用(id)$f左加入%I v2$
,当用户名='*'然后是'view1'或'view3'结束时为大小写
,数据库对象);
结束
$func$;

对于完全动态查询,请考虑先在客户端建立查询,而不是使用函数。

您首先需要了解基本知识:

还有更高级的选项,允许您在调用时传递返回类型。更多信息,请参见本手册最后一章:


如果返回是表,并且仅在条件来自应用程序的情况下(例如?@MaulikModi):如果总是相同的返回类型,则如上所述。如果只有
WHERE
子句中的值发生更改,那么这是一个带参数的普通查询。可能只是一个SQL函数,或者一个准备好的语句。请参阅:,否则视情况而定-可能仍然是动态SQL。问一个新问题,评论是不合适的。