Jer*_*emy 2 sql postgresql stored-procedures plpgsql
我尝试创建一个函数,该函数将返回以下查询的内容,其中 proto_location 的类型为文本。不确定这是否重要,但我当前调用此查询的 java 代码只是将每条记录读取为字符串。
SELECT DISTINCT tm.proto_location
FROM track_message tm
WHERE tm.workflow_analytic_instance_id = 204
AND EXISTS ( SELECT *
FROM track_message_to_track_mapping tm2tm
JOIN track t ON t.id = tm2tm.track_id
JOIN track_item ti ON t.id = ti.track_id
JOIN track_point tp ON ti.id = tp.track_item_id
WHERE tm.id =tm2tm.track_message_id
AND ti.item_time BETWEEN 1328816277089000 AND 1328816287089000
AND ST_Intersects
(tp.track_position
, ST_GeomFromText('POLYGON((-144 59, -41 46, -75 15, -127 25, -144 59))',4326)
)
)
;
Run Code Online (Sandbox Code Playgroud)
这是我的功能
CREATE OR REPLACE Function getTrackMessages(workflow bigint, start_time bigint, end_time bigint) returns text[]
as $$
SELECT DISTINCT tm.proto_location
FROM track_message tm
WHERE tm.workflow_analytic_instance_id = $1AND EXISTS ( SELECT *
FROM track_message_to_track_mapping tm2tm
JOIN track t ON t.id = tm2tm.track_id
JOIN track_item ti ON t.id = ti.track_id
JOIN track_point tp ON ti.id = tp.track_item_id
WHERE tm.id =tm2tm.track_message_id
AND ti.item_time BETWEEN $2 AND $3 AND ST_Intersects
(tp.track_position
, ST_GeomFromText('POLYGON((-144 59, -41 46, -75 15, -127 25, -144 59))',4326)
)
)
;
$$ Language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我不断收到一条错误消息,指出“select”处或附近的语法错误及其引用的行
SELECT DISTINCT tm.proto_location
Run Code Online (Sandbox Code Playgroud)
创建或替换函数 get_track_messages(工作流程 bigint, start_time bigint, end_time bigint)
返回SETOF 文本
语言sql AS
$函数$
选择不同的 tm.proto_location
来自 track_message tm
其中 tm.workflow_analytic_instance_id = $1
并且存在(
从 track_message_to_track_mapping tm2tm 中选择
连接轨道 t ON t.id = tm2tm.track_id
JOIN track_item ti ON t.id = ti.track_id
JOIN track_point tp ON ti.id = tp.track_item_id
其中 tm.id = tm2tm.track_message_id
并且 ti.item_time 介于 $2 和 $3 之间
AND ST_Intersects (tp.track_position
, ST_GeomFromText('多边形((-144 59, -41 46, -75 15, -127 25, -144 59))',4326))
);
$函数$;
最重要的是,它可以像sql函数一样工作。
对于 PL/pgSQL 函数,您需要进行更多更改:
创建或替换函数 get_track_messages(workflow bigint
, 开始时间 bigint
, end_time bigint)
返回SETOF 文本
语言plpqsql AS
$函数$
开始
退货查询
选择不同的...;
结束
$func$;
如果查询返回超过 1 行,您还需要SETOF(正如您自己计算的那样)。使用以下命令调用该函数:
SELECT * FROM get_track_messages( ... );
Run Code Online (Sandbox Code Playgroud)
proto_location是一个字符类型。如果您实际上想返回一个文本数组(例如您的标题状态),您可以像这样聚合:
SELECT array_agg(DISTINCT tm.proto_location) ...
Run Code Online (Sandbox Code Playgroud)
并将函数的返回类型调整为SETOF text[].
对于排序数组:
SELECT array_agg(DISTINCT tm.proto_location ORDER BY proto_location) ...
Run Code Online (Sandbox Code Playgroud)
或者,要获取排序列表 ( text) 而不是数组 ( text[]):
SELECT string_agg(DISTINCT tm.proto_location ORDER BY proto_location, ', ') ...
Run Code Online (Sandbox Code Playgroud)
看: