从函数参数设置PgSQL运行时参数?

时间:2019-01-29 13:30:41

标签: sql postgresql plpgsql

我用varchar参数创建了一个pl / pgsql函数。在此函数中,我尝试将运行时参数设置为function参数的值。

CREATE FUNCTION test_function (param VARCHAR)
RETURNS VOID AS $tf$
BEGIN
SET choice.p = param;
RAISE NOTICE '%', current_setting('choice.p');
END; $tf$ LANGUAGE plpgsql;

但是,打印的值是'param'。将param视为字符串而不是参数名称。为什么会这样,我如何实现自己的目标?

1 个答案:

答案 0 :(得分:0)

PL / pgSQL变量仅适用于SELECT和DML命令。这些语句有一个执行计划,可以用参数执行。 PLpgSQL运行时能够使用plpgsql变量作为参数。没有计划的静态SQL命令(例如DDL,SETSHOW,..)不能使用plpgsql变量。没有唯一的方法来执行此操作-并且存在歧义语义的风险。在这种情况下,您应该使用动态SQL。

DO $$
BEGIN
  EXECUTE format('SET choice.p = %L', 'some text);
  RAISE NOTICE '%', current_setting('choice.p');
END;
$$;

您的示例不起作用的主要原因很简单-SQL SET命令不支持表达式,然后就没有正确的方法来在其中应用plpgsql变量。