【问题标题】:Stored procedure to return count返回计数的存储过程
【发布时间】:2014-04-15 04:35:01
【问题描述】:

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

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

【问题讨论】:

    标签: sql postgresql stored-procedures plpgsql


    【解决方案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 函数中无效,在这里根本没用。

    【讨论】:

    • 我的函数出现此错误...错误:不能在非 SETOF 函数中使用返回查询第 5 行:返回查询 ^ ********** 错误** ******** 错误:不能在非 SETOF 函数 SQL 状态中使用 RETURN QUERY:42804 字符:86
    【解决方案2】:

    你可以使用这个模板

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2017-12-29
      • 2018-08-20
      相关资源
      最近更新 更多