在函数 plpgsql (POSTGIS) 中执行查询

Posted

技术标签:

【中文标题】在函数 plpgsql (POSTGIS) 中执行查询【英文标题】:Execution of a query in a function plpgsql (POSTGIS) 【发布时间】:2018-03-24 00:36:49 【问题描述】:

我正在寻找多边形内的所有点。该查询对我有用,但是当我将它们添加到函数 plggsql 时出现错误。

查询成功

SELECT id, the_geom
FROM vialidad
WHERE ST_Contains('POLYGON((-99.1981315612793 19.357945,-99.1981315612793 19.376003,-99.161634 19.376003,-99.161634 19.357945,-99.1981315612793 19.357945))',   ST_AsText(the_geom));

当我将查询添加到函数 plpgsql 并且创建的多边形位于多边形变量中时。

EXECUTE 'SELECT id,the_geom FROM vialidad WHERE ST_Contains('||polygon||',ST_AsText(vialidad_cdmx_vertices_pgr.the_geom));'  
INTO nodes
USING polygon;

控制台错误

QUERY:  SELECT id, the_geom FROM vialidad WHERE ST_Contains(POLYGON((-99.1981315612793 19.357945,-99.1981315612793 19.376003,-99.161634 19.376003,-99.161634 19.357945,-99.1981315612793 19.357945)),ST_AsText(the_geom));

CONTEXT:PL/pgSQL 函数 get_nodes_between_two_lines(integer,integer) 执行时第 37 行 ********** 错误**********

错误:“19.357945”或附近的语法错误 SQL 状态:42601

非常感谢您提供任何可能的帮助。

【问题讨论】:

你试过在单引号之间传递变量polygon吗? EXECUTE 'SELECT id,the_geom FROM vialidad WHERE ST_Contains('||quote_literal(polygon)||', ...:假设 polygon 是 WKT 文字。 【参考方案1】:

不要将字符串连接到您的 SQL 查询中。您已经使用 using 关键字将变量传递给 execute 命令,但您的查询不使用占位符。

EXECUTE 'SELECT id,the_geom FROM vialidad WHERE ST_Contains($1,ST_AsText(vialidad_cdmx_vertices_pgr.the_geom))'  
--                                                          ^ here
INTO nodes
USING polygon;

您选择 两个 列但仅提供带有 INTO 子句的 单个 目标变量的事实非常可疑。

但我认为你根本不需要动态 SQL,假设 polygon 一个变量,以下应该可以正常工作:

SELECT id, the_geom 
  into id_var, geom_var
FROM vialidad 
WHERE ST_Contains(polygon,ST_AsText(vialidad_cdmx_vertices_pgr.the_geom))

请注意,如果您在表vialidad 中有一个名为polygon 的列,这会给您带来问题。您应该重命名变量polygon,然后使用不同的名称。许多人简单地说例如l_ 在变量名前,l_polygonp_ 用于参数。

【讨论】:

【参考方案2】:

好像单独运行查询时,st_contains的第一个参数有单引号

ST_Contains('POLYGON((-99.1981315612793 19.357945,-99.1981315612793 19.376003,-99.161634 19.376003,-99.161634 19.357945,-99.1981315612793 19.357945))',   ST_AsText(the_geom));

但在控制台错误中,多边形周围没有单引号。您可以尝试插入单引号的函数

EXECUTE 'SELECT id,the_geom FROM vialidad WHERE ST_Contains('''||polygon||''',ST_AsText(vialidad_cdmx_vertices_pgr.the_geom));'  
INTO nodes
USING polygon;

【讨论】:

以上是关于在函数 plpgsql (POSTGIS) 中执行查询的主要内容,如果未能解决你的问题,请参考以下文章

无法执行 plpgsql/postgres 中的函数

如何在执行 SELECT... 语句时将表列传递给 plpgsql 函数

在 plpgsql 函数中使用 quote_ident()

如何在 plpgsql 函数中获取表的关键字段?

无法从 plpgsql 函数中的动态命名临时表运行“选择进入”

通过 RAW plpgsql 中的 UPDATE 语句获取受影响的行