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

标签 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
您的查询是:

 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/

相关文章:

sql-server - 在存储过程中是否应该避免常量的局部变量?

javascript - 有没有办法在 Azure DocumentDB 服务器代码中使用 JavaScript 库?

c++ - 传入此函数的参数类型是什么

javascript - DataTables:如何将变量放入表初始化代码中

arrays - PostgreSQL : How to create a constraint to check an element is not in an array of string

sql - 在 PostgreSQL 中表示稀疏数据

mysql - SQL存储过程和位运算符

java - 为什么使用 CachingParanamer 时 Paranamer 不返回方法名称?

mysql - 将 PostgreSQL 存储过程迁移到 MYSQL

sql - 快速全局分布的用户配额管理的体系结构