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

the*_*n29 1 sql postgresql dblink

我正在尝试编写一个函数,使用 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;
Run Code Online (Sandbox Code Playgroud)

但它返回一个类似的错误column "param" does not exist,这真的很烦人。我该怎么做?

Isl*_*gre 5

format 函数将为您提供'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;
Run Code Online (Sandbox Code Playgroud)