"USING" 处或附近的语法错误

Syntax error at or near "USING"

我正在尝试将在我们的地图服务器上的地图文件中找到的查询功能重新创建到 plpgsql 存储过程中。

这里是查询:

geom from (select g.gid, g.geom, g.basin, a.\"DATE\", a.\"VALUE\" from sarffg_basins_00_regional_3sec as g join \"%prod_table%\" as a on g.basin = a.\"BASIN\" where a.\"DATE\" = '%prod_date%') as subquery using unique gid using srid=4326

在我的存储过程中,我有:

RETURN QUERY
             EXECUTE 'SELECT geom FROM (
                             SELECT g.gid,
                             g.geom,
                             g.basin,
                             a.date,
                             a.value
                             FROM sarffg_basins_00_regional_3sec AS g
                             JOIN '||tablename_ts||' AS a
                             ON g.basin = a.basin
                             WHERE a.date = '''||adj_timestamp||''')
                             AS subquery USING UNIQUE gid USING srid=4326';

在我的映射文件中找到的上述查询工作正常。当我尝试在 psql 中调用我的存储过程时,我得到:

ERROR:  syntax error at or near "USING"
LINE 11:     AS subquery USING UNIQUE gid USING srid=4326
                     ^
QUERY:  SELECT geom FROM (
                            SELECT g.gid,
                            g.geom,
                            g.basin,
                            a.date,
                            a.value
                            FROM sarffg_basins_00_regional_3sec AS g
                            JOIN temp_table_ts AS a
                            ON g.basin = a.basin
                            WHERE a.date = '2017-01-15 00:00:00+00')
                            AS subquery USING UNIQUE gid USING srid=4326
CONTEXT:  PL/pgSQL function ingest_ffgs_prod_composite_csv(text,bigint,boolean,boolean) line 239 at RETURN QUERY

我还尝试在我的函数中省略 "using" 子句,而是在调用我的存储过程后将该部分留在映射文件中,即:

DATA "select * from ingest_ffgs_prod_composite_csv('%prod_table%', 1484438400) as subquery using unique gid using srid=4326"

存储过程包含:

RETURN QUERY
             EXECUTE 'SELECT geom FROM (
                             SELECT g.gid,
                             g.geom,
                             g.basin,
                             a.date,
                             a.value
                             FROM sarffg_basins_00_regional_3sec AS g
                             JOIN '||tablename_ts||' AS a
                             ON g.basin = a.basin
                             WHERE a.date = '''||adj_timestamp||''');

但这让我的地图服务器错误日志中出现错误:

[Wed Jan 25 02:28:17 2017].593733 msDrawMap(): Image handling error. Failed to draw layer named 'regional_basin_values'.
[Wed Jan 25 02:28:17 2017].659656 msPostGISLayerWhichShapes(): Query error. Error executing query: ERROR:  syntax error at or near "select"
LINE 1: ..._BASIN_TIMESERIES', 1484438400) as subquery where select * &...
                                                         ^

[Wed Jan 25 02:28:17 2017].659862 msDrawMap(): Image handling error. Failed to draw layer named 'regional_basin_product'.
[Wed Jan 25 02:28:22 2017].836950 msPostGISLayerWhichShapes(): Query error. Error executing query: ERROR:  syntax error at or near "select"
LINE 1: ..._BASIN_TIMESERIES', 1484438400) as subquery where select * &...

最后,我尝试将查询的前面部分留在 mapfile 中,只将子查询转换为存储过程:

地图文件:

DATA "geom from (select * from ingest_ffgs_prod_composite_csv('%prod_table%', 1484438400)) as subquery using unique gid using srid=4326"

存储过程:

RETURN QUERY
             EXECUTE 'SELECT g.gid,
                             g.geom,
                             g.basin,
                             a.date,
                             a.value
                             FROM sarffg_basins_00_regional_3sec AS g
                             JOIN '||tablename_ts||' AS a
                             ON g.basin = a.basin
                             WHERE a.date = '''||adj_timestamp||''');

这给我留下了:

[Wed Jan 25 02:35:36 2017].527302 msDrawMap(): Image handling error. Failed to draw layer named 'regional_basin_values'.
[Wed Jan 25 02:35:36 2017].617289 msPostGISLayerWhichShapes(): Query error. Error executing query: ERROR:  column "VALUE" does not exist
LINE 1: select "VALUE",encode(ST_AsBinary(ST_Force2D("geom"),'NDR'),...
           ^

[Wed Jan 25 02:35:36 2017].617511 msDrawMap(): Image handling error. Failed to draw layer named 'regional_basin_product'.
[Wed Jan 25 02:35:42 2017].103566 msPostGISLayerWhichShapes(): Query error. Error executing query: ERROR:  column "VALUE" does not exist
LINE 1: select "VALUE",encode(ST_AsBinary(ST_Force2D("geom"),'NDR'),...

这里正在执行的return语句是:

RETURN QUERY
                 EXECUTE 'SELECT g.'||quote_ident('gid')||',
                                 g.'||quote_ident('geom')||',
                                 g.'||quote_ident('basin')||',
                                 a.'||quote_ident('DATE')||',
                                 a.'||quote_ident('VALUE')||'
                                 FROM sarffg_basins_00_regional_3sec AS g JOIN '||quote_ident(prod_table)||' AS a
                                 ON g.'||quote_ident('basin')||' = a.'||quote_ident('BASIN')||'
                                 WHERE a.'||quote_ident('DATE')||' = '''||adj_timestamp||'''';

我已验证 prod_table 有一个名为 "VALUE" 的列,所以我不确定为什么会看到此错误。同样重要的是要注意,从 psql 中调用我的过程不会产生错误。

(我有两个非常相似的 return 语句,因为我的代码查询了带有大写列名称的 table,并且在没有 table 的情况下,它从 CSV 创建了一个没有大写名称。)

也不确定它是否相关,但这是我的功能 returns:

RETURNS table (
           gid integer,
           geom geometry(MultiPolygon,4326),
           basin double precision,
           date timestamptz,
           value double precision
           )

如有任何帮助,我们将不胜感激

我猜,您在过滤器中使用字段 VALUE 或在 mapfile 中使用类似的东西(如果没有 mapfile 很难确定)。 此过滤器必须使用大写列名,这就是原始查询也使用大写列名的原因:

select g.gid, g.geom, g.basin, a.\"DATE\", a.\"VALUE\" from.... 

如果是这样,您只需将过程返回的列大写:

RETURNS table (
           gid integer,
           geom geometry(MultiPolygon,4326),
           basin double precision,
           "DATE" timestamptz,
           "VALUE" double precision
           )

请记住,在 PostgreSql 中,如果用双引号将 then 括起来,则列和 table 名称的大小写很重要。 此查询:

SELECT VALUE from ...

不区分大小写,而这个:

SELECT "VALUE" from ...

确实需要 table 列名大写。并且 tables 大写的列名需要双引号:

CREATE TABLE test ("VALUE" text, .....