Postgresql plpgsql函数语法错误

标签 postgresql plpgsql

我想创建一个返回一组记录的函数,但出现语法错误。查询正在运行,但是当我将其嵌入到函数中时出现错误。可以做些什么来返回集合?

Error
ERROR: syntax error at or near "select"
LINE 27: select id, user_id, project_id, record_date, parselid, pars...
________^
********** Error **********
ERROR: syntax error at or near "select"
SQL state: 42601
Character: 832

函数代码

CREATE OR REPLACE FUNCTION getloggeom(
    IN p_lat double precision,
    IN p_lng double precision,
    OUT id integer, 
    OUT user_id bigint, 
    OUT project_id bigint, 
    OUT record_date timestamp without time zone, 
    OUT parselid integer, 
    OUT parselno character varying, 
    OUT adano character varying, 
    OUT ilid integer, 
    OUT ilad character varying, 
    OUT ilceid integer, 
    OUT ilcead character varying, 
    OUT mahallead character varying, 
    OUT mahalleid integer, 
    OUT pafta character varying, 
    OUT nitelik character varying, 
    OUT mevkii character varying, 
    OUT yuzolcum character varying, 
    OUT alan double precision, 
    OUT lat double precision, 
    OUT lng double precision, 
    OUT feature json)
  RETURNS SETOF record AS
$BODY$
    select id, user_id, project_id, record_date, parselid, parselno, adano, ilid, ilad, ilceid, ilcead, mahallead, mahalleid, pafta, nitelik, mevkii, yuzolcum, alan, st_x(st_centroid(st_transform(geom,4326))) as lng, st_y(st_centroid(st_transform(geom,4326))) as lat, (SELECT row_to_json(fc) as data
                     FROM ( SELECT 'FeatureCollection' As type, array_to_json(array_agg(f)) as features
                     FROM ( SELECT 'Feature' as type
                        , ST_AsGeoJSON(st_transform(ST_MakeValid(geom),4326))::json as geometry
                        , row_to_json(( parselid, ilad, ilcead, mahallead, adano, parselno, yuzolcum, st_y(st_centroid(st_transform(geom,4326))), st_x(st_centroid(st_transform(geom,4326))))) As properties
                       FROM log_geom where st_intersects((st_transform(st_setsrid(st_point(p_lng, p_lat), 4326), 500000)),geom ) limit 1)as f )  as fc) as feature  from log_geom where         
        ST_Intersects(
        st_transform(st_setsrid(st_point(p_lng, p_lat), 4326), 500000),geom
    )limit 1;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1000
  ROWS 1000;

最佳答案

如果使用 plpgsql,则必须包括 begin/end statements并且您必须根据 doc 使用 RETURN QUERY ... RETURN; .

否则你可以切换到使用SQL而不是 PLPGSQL,您的函数将按原样运行。

CREATE OR REPLACE FUNCTION getloggeom([...])
  RETURNS SETOF record AS
$BODY$
    [...]
$BODY$
  LANGUAGE SQL
  COST 1000
  ROWS 1000;

关于Postgresql plpgsql函数语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44961213/

相关文章:

postgresql - 循环遍历plpgsql中的复合数组

postgresql - 有没有办法在 Postgres 中按需一次生成一些行集?

postgresql - 如何使用 Zabbix 通过简单的无代理检查来配置数据库服务状态

sql - 指定 1 到 5 之间的数字列

postgresql - 用 2 列的多条记录构造一个字符串

php - Postgresql自定义函数返回表

postgresql - 数字类型 : "(0.0000000000000000,8)" 的输入语法无效

sql - 替代 SQL 计数子查询

node.js - 当需要检查 jsonb 列中是否存在某个键时,如何使用 Sequelize 中的 queryInterface.bulkUpdate?

postgresql - 打印 DO 匿名 block 的执行输出