加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – PL/pgSQL函数中的可选参数

发布时间:2020-12-13 16:35:25 所属栏目:百科 来源:网络整理
导读:我正在尝试用可选参数编??写PL / pgSQL函数。它基于过滤的记录集(如果指定)执行查询,否则对表中的整个数据集执行查询。 例如(PSEUDO CODE): CREATE OR REPLACE FUNCTION foofunc(param1 integer,param2 date,optional_list_of_ids=[]) RETURNS SETOF RECOR
我正在尝试用可选参数编??写PL / pgSQL函数。它基于过滤的记录集(如果指定)执行查询,否则对表中的整个数据集执行查询。

例如(PSEUDO CODE):

CREATE OR REPLACE FUNCTION foofunc(param1 integer,param2 date,optional_list_of_ids=[]) RETURNS SETOF RECORD AS $$
    IF len(optional_list_of_ids) > 0 THEN
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2 AND id in optional_list_of_ids);
    ELSE
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2);
    ENDIF
$$ LANGUAGE SQL;

实现此功能的正确方法是什么?

顺便说一句,我想知道如何在另一个外部函数中调用这样的函数。我就是这样做的 – 它是正确的,还是有更好的方法?

CREATE FUNCTION foofuncwrapper(param1 integer,param2 date) RETURNS SETOF RECORD AS $$
BEGIN
   CREATE TABLE ids AS SELECT id from foobar where id < 100;
   RETURN QUERY (SELECT * FROM foofunc(param1,param2,ids));
END
$$ LANGUAGE SQL
自从PostgreSQL 8.4(您似乎正在运行)以来,有 default values for function parameters.如果您将参数设置为最后并提供默认值,则可以在调用中省略它:
CREATE OR REPLACE FUNCTION foofunc(_param1 integer,_param2 date,_ids    int[] DEFAULT '{}')
  RETURNS SETOF foobar AS -- declare return type!
$func$
BEGIN  -- required for plpgsql
   IF _ids <> '{}'::int[] THEN -- exclude empty array and NULL
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2
      AND    id = ANY(_ids); -- "IN" is not proper syntax for arrays
   ELSE
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2;
   END IF;
END  -- required for plpgsql
$func$  LANGUAGE plpgsql;

主要观点:

>关键字DEFAULT用于声明参数默认值。短期替代方案:=。
>我从凌乱的例子中删除了多余的param1。
>由于返回SELECT * FROM foobar,因此将返回类型声明为RETURNS SETOF foobar而不是RETURNS SETOF记录。具有匿名记录的后一种形式非常笨拙,您必须为每次调用提供列定义列表。
>我使用整数(int [])数组作为函数参数。相应地改编了IF表达式和WHERE子句。
>在纯SQL中没有IF语句。必须是LANGUAGE plpgsql。

使用或不使用_ids调用:

SELECT * FROM foofunc(1,'2012-1-1'::date);

实际上是一样的:

SELECT * FROM foofunc(1,'2012-1-1'::date,'{}'::int[]);

你必须确保通话是明确的。如果你有另一个同名和两个参数的函数,Postgres可能不知道要选哪个。显式演员(就像我演示的那样)缩小了它。否则,无类型的字符串文字也可以工作,但显式永远不会受到伤害。

从另一个函数调用:

CREATE FUNCTION foofuncwrapper(_param1 integer,_param2 date)
  RETURNS SETOF foobar AS
$func$
DECLARE
   _ids int[] := '{1,2,3}';
BEGIN
   -- irrelevant stuff

   RETURN QUERY
   SELECT * FROM foofunc(_param1,_param2,_ids);
END
$func$  LANGUAGE plgpsql;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读