如何将函数参数值作为值传递给PLpgSQL中的另一个函数?

时间:2018-03-23 11:47:24

标签: postgresql function plpgsql

我有以下功能:

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:我需要添加更多详细信息才能发布问题,因为我的帖子主要是代码!

1 个答案:

答案 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不是数字常量。