PostgreSQL: в запросе dblink отсутствует параметр $ 1

В настоящее время я использую 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 ответ

Решение

Вы забыли преобразовать параметр $1 для удаленного запроса.
Ваш запрос:

 dblink('esms_ref', 'SELECT * FROM registration WHERE studid=$1')

Какое значение для параметра $1? Запросы, выполняемые dblink, имеют свое собственное пространство имен, переменные plpgsql там не распространяются неявно. $1 в теле функции plpgsql не ссылается на $1 в запросе dblink (или другом динамическом). Вы должны явно объединить параметр в строку запроса:

dblink('esms_ref', 
   format('SELECT * FROM registration WHERE studid=%L', $1))
Другие вопросы по тегам