加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从PostgreSQL函数返回SETOF行

发布时间:2020-12-13 16:29:42 所属栏目:百科 来源:网络整理
导读:我有一种情况,我想在两个视图之间返回连接.那是很多专栏.在sql server中很容易.但是在PostgreSQL中我加入的时候.我收到错误“需要列定义列表”. 有什么方法可以绕过这个,我不想提供返回列的定义. CREATE OR REPLACE FUNCTION functionA(username character v
我有一种情况,我想在两个视图之间返回连接.那是很多专栏.在sql server中很容易.但是在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$
消毒功能

The manual具有PL / pgSQL的所有基础知识.基本上,你所拥有的东西可以简化/消毒到:

CREATE OR REPLACE FUNCTION func_a(username text = '',databaSEObject text = '')
  RETURNS ???? AS
$func$
BEGIN

RETURN QUERY EXECUTE
format ('SELECT * FROM %s v1 LEFT JOIN %I v2 USING (id)',CASE WHEN username = '*' THEN 'view1' ELSE 'view3' END,databaSEObject);

END
$func$ LANGUAGE plpgsql;

>除了启动具有自己范围的单独代码块之外,您不需要额外的BEGIN .. END in the function body实例,这很少需要.
>标准SQL连接运算符是||.是您以前的供应商的“创意”添加.
>除非你引用它们,否则不要使用CaMeL-case identifiers.最好你根本不使用它们:

> Are PostgreSQL column names case-sensitive?

> varchar(4000)也适用于SQL Server的特定限制.这种数据类型在Postgres中没有任何性能优势.如果您确实需要4000个字符的限制,请仅使用它.我只想使用text – 除了我简化函数之后我们根本不需要任何变量.
>如果你还没有使用format(),那么,consult the manual here.

返回类型

现在,对于您的实际问题:动态查询的返回类型有点棘手,因为SQL要求函数返回定义良好的类型.如果数据库中的表或视图或复合类型已经与要返回的列定义列表匹配,则可以使用:

CREATE FUNCTION foo()
  RETURNS SETOF my_view AS
...

如果您正在进行输入,则可以返回匿名记录:

CREATE FUNCTION foo()
  RETURNS SETOF record AS
...

或者提供一个列定义列表(最简单)RETURNS TABLE:

CREATE FUNCTION foo()
  RETURNS TABLE (col1 int,col2 text,...) AS
...

匿名记录的缺点:然后你必须提供每个调用的列定义列表,所以我几乎没有使用它.

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

CREATE OR REPLACE FUNCTION func_a(username text = '',databaSEObject text = '')
  RETURNS TABLE(col1 int,col3 date) AS
$func$
BEGIN

RETURN QUERY EXECUTE
format ('SELECT v1.col1,v1.col2,v2.col3
         FROM %s v1 LEFT JOIN %I v2 USING (id)$f$,databaSEObject);

END
$func$;

对于完全动态的查询,我宁愿使用简单的SQL查询开始.不是功能.

有更多高级选项,但您可能需要先学习基础知识.

> Refactor a PL/pgSQL function to return the output of various SELECT queries

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读