将变量连接到 PL/pgSQL 中的动态 SELECT 语句

Concatenate variable into dynamic SELECT statement in PL/pgSQL

我想在动态 SELECT 语句(即 EXECUTE 语句中)中使用变量,如下所示:

CREATE OR REPLACE FUNCTION get_factor()
  RETURNS TABLE(factor numeric) AS
$BODY$
DECLARE
    _query character varying;
    _some_condition integer := 50;
    _result decimal;
BEGIN
    _query := 'SELECT factors.factor_material FROM factors
               WHERE factors.condition = _some_condition;';

    EXECUTE _query INTO _result;

    RETURN QUERY SELECT _result;
END;

我有一个变量 _some_condition integer := 50;,我想将它的值连接到 SELECT 语句 (...WHERE factors.condition = _some_condition;) 中,但是这给了我一个 "column does no exist" 错误:

ERROR:  column "_some_condition" does not exist
LINE 1: ...erial WHERE factors.city_id = _some_cond...
                                         ^

CONTEXT:  PL/pgSQL function get_factor() line 12 at EXECUTE statement

为什么会出现此错误以及如何解决?请记住,我必须使用动态 SELECT 语句。

由于您试图传递 value(这与 literal, 顺便说一句), 你只需要 USING clause of the plpgsql EXECUTE command, like .

同时,使用 RETURN QUERY EXECUTE 简化您的函数:

CREATE OR REPLACE FUNCTION get_factor()
  RETURNS TABLE(factor numeric) AS
$func$
DECLARE
   _some_condition integer := 50;
BEGIN
   RETURN QUERY EXECUTE 
      'SELECT factor_material
       FROM   factors
       WHERE  condition = '
   USING _some_condition;
END
$func$ LANGUAGE plpgsql;

此示例中的任何内容都不需要动态 SQL。你可以:

RETURN QUERY
SELECT f.factor_material
FROM   factors f
WHERE  f.condition = _some_condition;