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用于声明参数默认值。短期替代方案:=。 使用或不使用_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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |