我目前使用 PostgreSQL 9.3,我正在尝试使用这个连接到另一个数据库 (esms) 的函数,并且该函数的结果将在另一个数据库 (seis) 中的另一个函数中进行比较和使用。
CREATE OR REPLACE FUNCTION lowest_grade_query(varchar) RETURNS numeric AS $$
DECLARE
test numeric(3,2);
BEGIN
PERFORM dblink_connect_u('esms_ref', 'dbname=esms user=postgres password=postgres');
SELECT * INTO test FROM dblink('esms_ref', 'SELECT MAX(to_number(CASE WHEN grade IN (''DRP'', ''INC'')
THEN ''5.00''
ELSE grade END, ''9D99''))
FROM registration
WHERE studid=$1') AS lowest_grade(grade numeric(3,2));
PERFORM dblink_disconnect('esms_ref');
RETURN test;
END;
$$ LANGUAGE plpgsql;
但是当我尝试这个
SELECT lowest_grade_query('2014-0035');
我收到此错误:
ERROR: there is no parameter $1
CONTEXT: Error occurred on dblink connection named "esms_ref": could not execute query.
SQL statement "SELECT * FROM dblink('esms_ref', 'SELECT MAX(to_number(CASE WHEN grade IN (''DRP'', ''INC'')
THEN ''5.00''
ELSE grade END, ''9D99''))
FROM registration
WHERE studid=$1') AS lowest_grade(grade numeric(3,2))"
哪里出了问题?
最佳答案
您忘记转换远程查询的参数$1
。
您的查询是:
dblink('esms_ref', 'SELECT * FROM registration WHERE studid=$1')
参数$1
的值是多少? dblink 执行的查询有自己的命名空间,plpgsql 变量不会隐式传播到那里。 plpgsql 函数体中的 $1
与 dblink(或其他动态)查询中的 $1
引用不同。您必须显式地将参数合并到查询字符串中:
dblink('esms_ref',
format('SELECT * FROM registration WHERE studid=%L', $1))
关于PostgreSQL:dblink 查询中没有参数 $1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28513017/