postgresql 存储过程返回count

2skhul33  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(3)|浏览(172)

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

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写这种类型的存储过程,它返回位于指定城市的分支机构管理的帐户数。

u2nhd7ah

u2nhd7ah1#

PL/pgSQL版本可以看起来像这样:

CREATE FUNCTION account_count_in(_branch_city text)
  RETURNS int
  LANGUAGE plpgsql 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$;

电话:

SELECT account_count_in('Albany');

避免命名冲突。使参数名称在查询中唯一或具有表限定的列。我两样都做了。
对于这样一个简单的查询,只需RETURN结果。
函数声明为返回integer。通过将bigint强制转换为int,确保返回类型匹配。
NATURAL JOIN是短语法,但它可能不是最安全的形式。以后对基础表的更改很容易破坏这一点。最好显式地连接列名。
PERFORM仅在PL/pgSQL函数中有效,在SQL函数中无效,在这里没有用。

2admgd59

2admgd592#

您可以使用此模板

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

jgzswidk3#

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;

相关问题