将函数参数传递给动态查询字符串

时间:2019-08-22 12:27:22

标签: postgresql plpgsql dynamicquery

我正在使用PostGreSQL 11.4,刚开始使用动态查询,但是缺少了一些东西。我想在查询中使用一个函数参数,但做错了。

这就是我所拥有的:

create or replace function media_query.my_test(p_from_timestamp timestamptz) RETURNS TABLE (moshe timestamptz) as
$aa$
BEGIN
    RETURN QUERY EXECUTE 'select p_from_timestamp as moshe';
END $aa$ LANGUAGE plpgsql;

执行select * from media_query.my_test(now()); 时收到错误column "p_from_timestamp" does not exist

因此它不是列,而是变量...我如何将其视为变量?

我是否需要将变量转换为字符串变量并将其与选择联系?没有办法查询字符串本身以某种方式解析变量?

谢谢

1 个答案:

答案 0 :(得分:1)

最好将其用作参数,这样就不必担心转义值,也不必担心SQL注入:

CREATE FUNCTION media_query.my_test(p_from_timestamp timestamptz)
   RETURNS TABLE (moshe timestamptz)
   IMMUTABLE AS
$aa$
BEGIN
    RETURN QUERY EXECUTE 'select $1' USING p_from_timestamp;
END;$aa$
LANGUAGE plpgsql;

如果您的目标是从字面量构造查询字符串,请按以下步骤操作:

CREATE FUNCTION media_query.my_test(p_from_timestamp timestamptz)
   RETURNS TABLE (moshe timestamptz)
   IMMUTABLE AS
$aa$
BEGIN
    RETURN QUERY EXECUTE format('select %L', p_from_timestamp);
END;$aa$
LANGUAGE plpgsql;