我正在尝试为我的查询创建一个存储过程:
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中编写这种类型的存储过程,返回返回由指定城市中的分支管理的帐户数。
答案 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()