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))