我有以下功能:
func_example(arg_1 anyelement, arg_2 anyelement);
另外,我
CREATE OR REPLACE FUNCTION func_name(
p_value_1 anyelement,
...
p_value_n anyelement,
p_name_1 anyelement,
...
p_name_n anyelement)
LANGUAGE 'plpgsql'
AS $func_name$
DECLARE
n smallint,
BEGIN
n =: (see calculation of the number][1])
FOR i IN (1..n) LOOP
IF func_example(format('p_value_%s', i), format('p_name_%s', i)) THEN -- a) fails OR
IF func_example($i, $(i+n)) THEN -- b) fails, too
do_something;
END IF;
END LOOP;
END;
AS $func_name$;
[1] https://stackoverflow.com/a/49408494/8895614
以防:
a)p_value_1
作为text
类型传递,
b)syntax error at or near $
i出现。
任何解决方法?
蒂亚
PS:我需要添加更多详细信息才能发布问题,因为我的帖子主要是代码!
答案 0 :(得分:1)
PLpgSQL是非常静态(和经典)语言。没有可能迭代函数参数。它是为静态业务流程设计的老派语言。它可以在C扩展中。可能有其他PL语言,如PLPerl或PLPythonu。
另一个解决方案是使用数组作为参数而不是params。您也可以使用可变参数函数:
CREATE FUNCTION fx(a int, b variadic anyarray)
RETURNS void AS $$
BEGIN
RAISE NOTICE '%', b[1:a];
END;
$$ LANGUAGE plpgsql;
postgres=# SELECT fx(1, 10, 20); NOTICE: {10} ┌────┐ │ fx │ ╞════╡ │ │ └────┘ (1 row) postgres=# SELECT fx(2, 10, 20); NOTICE: {10,20} ┌────┐ │ fx │ ╞════╡ │ │ └────┘ (1 row)
PLpgSQL中没有其他功能。无法通过$n
读取参数,其中n不是数字常量。