Postgresql 使用Pl/pgSQL向循环中的查询传递参数

Postgresql 使用Pl/pgSQL向循环中的查询传递参数,postgresql,plpgsql,Postgresql,Plpgsql,我正在尝试创建一个参数化查询,该查询将使用plpgsql在循环中执行 这两个参数将是传递到查询中的起始纬度/经度点。纬度和经度点将从一个数组中检索,因此它将是一个类似于foreach的迭代,在数组中进行迭代,并将两个lat/lon值传递到查询中,以便每次执行 我该怎么做这样的事 我的查询和实现方式如下所示:X、Z值是将要传递的参数纬度/经度值,Y和T将通过执行我将处理的特定计算来获得。为清楚起见,我的查询返回多行和多列结果timestamp和count,因为它计算并返回属于小时间隔timesta

我正在尝试创建一个参数化查询,该查询将使用plpgsql在循环中执行

这两个参数将是传递到查询中的起始纬度/经度点。纬度和经度点将从一个数组中检索,因此它将是一个类似于foreach的迭代,在数组中进行迭代,并将两个lat/lon值传递到查询中,以便每次执行

我该怎么做这样的事

我的查询和实现方式如下所示:X、Z值是将要传递的参数纬度/经度值,Y和T将通过执行我将处理的特定计算来获得。为清楚起见,我的查询返回多行和多列结果timestamp和count,因为它计算并返回属于小时间隔timestamp的请求数

for each latitude-longitude pair X,Z in array

find Y and T from X and Z

WITH cal AS (
    SELECT generate_series('2011-02-02 00:00:00'::timestamp ,
                           '2012-04-01 05:00:00'::timestamp , 
                           '1 hour'::interval) AS stamp
),
qqq AS (
  SELECT date_trunc('hour', calltime) AS stamp, count(*) AS zcount
  FROM mytable
  WHERE calltime >= '2011-02-13 22:55:11' 
    AND calltime <= '2012-02-13 01:02:21'
    AND (calltime::time >= '22:55:11' 
    OR calltime::time <= '01:02:21')
    AND lat >= X 
    AND lat <= Y
    AND lon >= Z
    AND lon <= T
 GROUP BY date_trunc('hour', calltime)
)
SELECT cal.stamp, COALESCE (qqq.zcount, 0) AS zcount
FROM cal
LEFT JOIN qqq ON cal.stamp = qqq.stamp
WHERE cal.stamp >= '2011-02-13 22:00:00' 
  AND cal.stamp <= '2012-02-13 01:02:21' 
  AND (
    extract ('hour' from cal.stamp) >= extract ('hour' from '2011-02-13 22:00:00'::timestamp) or
    extract ('hour' from cal.stamp) <= extract ('hour' from '2012-02-13 01:02:21'::timestamp) 
  )
ORDER BY stamp ASC;
将数组传递到函数中,对于SELECT*FROM UNNEST中的r,数组元素上的_数组循环,其中r是函数DECLARE子句中的记录变量;或

在传递给函数的refcursor上循环。看

更好的是,避免循环并将SELECT UNNESTHEARRAY集成到CTE中。PL/PgSQL中的循环比SQLCTE中的等效循环慢得多


我想我会和第二个一起走,因为我必须传递大约100万个不同的LAT/Lon值,结果将在C++端被处理,所以速度是至关重要的。非常感谢您提供的提示。@sm90901 Yikes,您当然不需要阵列了!Refcursors或临时表是处理此类数据量的方法。