【问题标题】:PostgreSQL function returning a tablePostgreSQL 函数返回一个表
【发布时间】:2014-09-21 10:26:37
【问题描述】:

我需要创建一个函数来计算每个分支的帐户总和并进行比较 到分支余额。

我尝试过这样做:

CREATE OR REPLACE FUNCTION t3() RETURNS TABLE(bb integer, sum integer) AS $$ 
BEGIN
FOR i IN 1..50 LOOP
BEGIN
SELECT bbalance FROM branch WHERE branchid = i
union
SELECT  sum(balance) FROM account WHERE branch = i;
END;
END LOOP;
END;
$$ LANGUAGE plpgsql;

我现在有点困惑......我希望它返回一个包含 2 列的表:一个具有分支中 bbalance 的值;第二个是该分支中每个余额的总和。

我需要一些可以用select * from t3() 打电话的东西。

这就是我在 pgAdmin 查询编辑器中写的:

CREATE OR REPLACE FUNCTION t3() RETURNS TABLE(bb integer, sum integer) AS $$ 
DECLARE
   bal integer;
BEGIN
  FOR i IN SELECT branchid FROM branch
  LOOP
    SELECT INTO bb bbalance FROM branch WHERE branchid = i;
    SELECT INTO "sum" sum(balance) FROM account WHERE branch = i;
    RETURN NEXT;
  END LOOP;
  RETURN;
END;
$$ LANGUAGE plpgsql;

错误是:

ERRORE:  variabile del ciclo sulle righe deve essere una variabile di tipo row o record o una lista di variabili scalari
LINE 5:   FOR i IN SELECT branchid FROM branch
              ^

********** Error **********

ERRORE: variabile del ciclo sulle righe deve essere una variabile di tipo row o record o una lista di variabili scalari
SQL state: 42601
Character: 119

意大利语 - 翻译为:
对行进行循环的循环变量必须是记录或行变量或标量变量列表。

【问题讨论】:

  • 在会话中运行 SET lc_messages = 'C'; 以获取英文错误消息。

标签: sql function postgresql loops plpgsql


【解决方案1】:

你需要设置表变量而不是RETURN NEXT,例如

CREATE OR REPLACE FUNCTION t3() RETURNS TABLE(bb integer, sum integer) AS $$ 
DECLARE
   i integer;
BEGIN
  FOR i IN SELECT branchid FROM branch
  LOOP
    SELECT INTO bb bbalance FROM branch WHERE branchid = i;
    SELECT INTO "sum" sum(balance) FROM account WHERE branch = i;
    RETURN NEXT;
  END LOOP;
  RETURN;
END;
$$ LANGUAGE plpgsql;

但实际上,所有这些都可以在没有 PL/PgSQL 的情况下更干净地完成,因为连接上的一个微不足道的 GROUP BY:

SELECT b.branchid, b.bbalance, coalesce(sum(a.balance), 0) AS acctbalance
FROM branch b LEFT OUTER JOIN account a ON (b.branchid = a.branch)
GROUP BY b.branchid;

顺便说一句,“sum”作为参数名称的选择并不好,因为它是一个常用的内置聚合函数。

【讨论】:

  • 我试过了,它抛出了这个:error return next cannot have a parameter in function without parameters
  • @Sanci 已修复,见上文。
  • 现在它说:循环遍历行的循环变量必须是记录或行变量或标量变量列表。你是对的参数名称,我写得很随机,基本上只是为了测试它
  • @Sanci 请显示更新的功能和确切的错误(作为对问题的编辑),完成后在此处评论。
  • @Sanci 哦,我的愚蠢的编辑错误,等等。将循环变量声明为 bal 而不是 i
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多