从函数参数设置 PSQL 运行时参数?
Set PgSQL runtime-paramter from function parameter?
我创建了一个带有 varchar 参数的 pl/pgsql 函数。在此函数中,我尝试将运行时参数设置为函数参数的值。
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 被视为字符串而不是参数名称。为什么会这样,我怎样才能实现我想做的事情?
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 变量那里。
我创建了一个带有 varchar 参数的 pl/pgsql 函数。在此函数中,我尝试将运行时参数设置为函数参数的值。
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 被视为字符串而不是参数名称。为什么会这样,我怎样才能实现我想做的事情?
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 变量那里。