存储过程返回计数

时间:2014-04-15 04:35:01

标签: sql postgresql stored-procedures plpgsql

我正在尝试为我的查询创建一个存储过程:

SELECT count(DISTINCT account_number)
from account
NATURAL JOIN branch
WHERE branch.branch_city='Albany';

SELECT count(*)
from (
   select distinct account_number
   from account
   NATURAL JOIN branch
   WHERE branch.branch_city='Albany'
   ) as x;

我编写了这个存储过程,但是它返回列中所有记录的计数而不是查询结果,我需要在plpgsql中编写存储过程而不是SQL。

CREATE FUNCTION account_count_in(branch_city varchar) RETURNS int AS $$
   PERFORM DISTINCT count(account_number) from (account NATURAL JOIN branch)
   WHERE (branch.branch_city=branch_city); $$ LANGUAGE SQL;

帮助我在plpgsql中编写这种类型的存储过程,返回返回由指定城市中的分支管理的帐户数。

2 个答案:

答案 0 :(得分:1)

plpgsql版本可能如下所示:

CREATE FUNCTION account_count_in(_branch_city text)
  RETURNS int AS
$func$
BEGIN
   RETURN (
   SELECT count(DISTINCT a.account_number)::int
   FROM   account a
   NATURAL JOIN branch b
   WHERE  b.branch_city = _branch_city
   );
END
$func$ LANGUAGE plpgsql;

呼叫:

SELECT account_count_in('Albany');
  • 通过在查询中使参数名称唯一或符合表格的列来避免命名联盟。我做了两件事。

  • 只需RETURN这样的简单查询结果。

  • 该函数声明为integer。通过将bigint转换为int

  • ,确保返回类型匹配
  • NATURAL JOIN是一种简短的语法,但它可能不是最安全的形式。稍后对基础表的更改很容易打破这一点。最好明确加入列名。

  • PERFORM仅在plpgsql函数中有效,而不在sql函数中有效,在此处根本没用。

答案 1 :(得分:1)

您可以使用此模板

CREATE OR REPLACE FUNCTION a1()
  RETURNS integer AS
$BODY$
BEGIN
    return (select 1);
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
select a1()