将语句更新为函数PostgreSQL

将语句更新为函数PostgreSQL,postgresql,stored-procedures,plpgsql,Postgresql,Stored Procedures,Plpgsql,我有以下有效的代码: UPDATE backup_factura SET tipo = CASE WHEN total_fact <=100 THEN 'X' WHEN total_fact <=200 THEN 'Y' ELSE 'Z' END RETURNING *; 我还尝试了一种更复杂的方法: CREATE Function sp

我有以下有效的代码:

UPDATE backup_factura 
    SET tipo = CASE 
                 WHEN total_fact <=100 THEN 'X'
                 WHEN total_fact <=200 THEN 'Y'
                 ELSE 'Z'
               END
RETURNING *; 
我还尝试了一种更复杂的方法:

CREATE Function sp_test_case () returns void as $$ 
DECLARE
    cont int=(Select MAX(id_fact)from backup_factura);
BEGIN

  while cont>0
  LOOP

    UPDATE backup_factura
    SET tipo= CASE 
            WHEN ((total_fact) <=100) THEN 'X'
            WHEN ((total_fact) <=200) THEN 'Y'
            ELSE 'Z'
           END;

    WHERE id_fact=cont;

    cont:=cont-1;

   END LOOP;

RETURN;   
END;   
$$ LANGUAGE plpgsql; 
重点是展示这样的东西:


您可以使用
返回查询
语法并返回表的
集合:

CREATE Function sp_test_case () RETURNS SETOF backup_factura AS $$ 
BEGIN

  RETURN QUERY
  UPDATE backup_factura 
    SET tipo = CASE 
                 WHEN total_fact <=100 THEN 'X'
                 WHEN total_fact <=200 THEN 'Y'
                 ELSE 'Z'
               END
  RETURNING *;
END;   
$$ LANGUAGE plpgsql; 
CREATE函数sp\u test\u case()将备份事实集返回为$$
开始
返回查询
更新备份文件
设置tipo=案例

当total_fact时,您可以修复plpgsql函数,如@Mureinik post。或者,最好使用更简单的方法:


我尝试了你的代码,但它只显示:“(5,48101.252012-05-16,“2012-05-31 00:00:00”,Y)”和另外3行。谢谢你的回答!如果需要单独返回列,则应使用
select*from sp\u test\u case()
调用函数。如果这不是问题,请解释为什么这个返回值不正确。我已经做了。我不明白的是,如何让表格看起来像我刚刚上传的表格,而不是我在前面的评论中提到的一列数据
select*from sp_test_case()
(与
select sp_test_case()
)相反)应该做到这一点。。。您使用的是哪个Postgress版本?哪个客户呢?我错了。我注意到我错过了*。是我的错。话题解决了。谢谢!当我运行Select sp_test_case()时;我得到的代码与@Mureinik的代码相同:“(5,48101.252012-05-16,“2012-05-31 00:00:00”,Y)”通过我发布的第一个代码,我可以在我的帖子末尾得到表格。但有了你的代码,我只得到了一个简单的column@MichVellve考虑一下我添加的调用语法。code>SELECT*FROM..
用于将行分解为单独的列。非常感谢!我的错误。非常感谢您的快速回答!
CREATE Function sp_test_case () returns void as $$ 
DECLARE
    cont int=(Select MAX(id_fact)from backup_factura);
BEGIN

  while cont>0
  LOOP

    UPDATE backup_factura
    SET tipo= CASE 
            WHEN ((total_fact) <=100) THEN 'X'
            WHEN ((total_fact) <=200) THEN 'Y'
            ELSE 'Z'
           END;

    WHERE id_fact=cont;

    cont:=cont-1;

   END LOOP;

RETURN;   
END;   
$$ LANGUAGE plpgsql; 
********** Error **********
ERROR: syntax error at or near "WHERE"
SQL state: 42601
Character: 283
CREATE Function sp_test_case () RETURNS SETOF backup_factura AS $$ 
BEGIN

  RETURN QUERY
  UPDATE backup_factura 
    SET tipo = CASE 
                 WHEN total_fact <=100 THEN 'X'
                 WHEN total_fact <=200 THEN 'Y'
                 ELSE 'Z'
               END
  RETURNING *;
END;   
$$ LANGUAGE plpgsql; 
CREATE FUNCTION sp_test_case ()
   RETURNS SETOF backup_factura AS
$func$
UPDATE backup_factura 
SET    tipo = CASE WHEN total_fact <= 100 THEN 'X'
                   WHEN total_fact <= 200 THEN 'Y'
                   ELSE 'Z' END
RETURNING *;
$func$ LANGUAGE sql; 
SELECT * FROM sp_test_case();