我用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视为字符串而不是参数名称。为什么会这样,我如何实现自己的目标?
答案 0 :(得分:0)
PL / pgSQL变量仅适用于SELECT
和DML命令。这些语句有一个执行计划,可以用参数执行。 PLpgSQL运行时能够使用plpgsql变量作为参数。没有计划的静态SQL命令(例如DDL,SET
,SHOW
,..)不能使用plpgsql变量。没有唯一的方法来执行此操作-并且存在歧义语义的风险。在这种情况下,您应该使用动态SQL。
DO $$
BEGIN
EXECUTE format('SET choice.p = %L', 'some text);
RAISE NOTICE '%', current_setting('choice.p');
END;
$$;
您的示例不起作用的主要原因很简单-SQL SET
命令不支持表达式,然后就没有正确的方法来在其中应用plpgsql变量。