PostgreSQL/dblink:发送带有文本参数条件的查询

PostgreSQL/dblink: send a query with a condition on a text parameter

我正在尝试编写一个使用 dblink 将查询发送到外部数据库的函数,但我需要在文本列上设置一个条件,但它不起作用。 看起来像这样;

CREATE OR REPLACE FUNCTION dblink_test(param VARCHAR(32))
RETURNS TABLE (...) AS $$
BEGIN
    PERFORM dblink_connect('myconn', ...);
    RETURN QUERY SELECT * FROM dblink('myconn',
        format('SELECT * FROM someTable where name= %s', param));
END
$$ LANGUAGE plpgsql;

但它 return 像 column "param" does not exist 这样的错误,这真的很烦人。我该怎么做?

格式函数会给你输入 'abc' 类似的东西:

SELECT * FROM someTable where name= abc

但是你想检查字符串文字,因此你需要引用字符串(就像在 SQL 中一样)。我建议使用 quote_literal()(以避免 SQL 注入):

CREATE OR REPLACE FUNCTION dblink_test(param VARCHAR(32))
RETURNS TABLE (...) AS $$
BEGIN
    PERFORM dblink_connect('myconn', ...);
    RETURN QUERY SELECT * FROM dblink('myconn',
        format('SELECT * FROM someTable where name = %s', quote_literal(param)));
END
$$ LANGUAGE plpgsql;