【问题标题】:Set PgSQL runtime-paramter from function parameter?从函数参数设置 PSQL 运行时参数?
【发布时间】:2019-01-29 13:30:40
【问题描述】:

我创建了一个带有 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 被视为字符串而不是参数名称。为什么会这样,我怎样才能实现我的目标?

【问题讨论】:

  • 您是否知道已经有一个功能可以做到这一点? set_config()
  • 不,我不知道。它现在正在工作!我把线路改成了PERFORM set_config('choice.p', param, false); 但是,我还是不太明白之前发生了什么。
  • SET 语法允许不带引号的值(例如 SET fsync = on),看起来这就是它对 param 的解释方式

标签: sql postgresql plpgsql


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多