PostgreSQL:dblink查询中没有参数$ 1

时间:2015-02-14 06:12:40

标签: postgresql stored-procedures parameters postgresql-9.3 dblink

我目前正在使用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 个答案:

答案 0 :(得分: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))