2012-09-20 124 views
0

我試圖創建一個參數查詢,該參數查詢將在使用plpgsql的循環中執行。使用Pl/pgSQL將參數傳遞給循環中的查詢

2參數將成爲傳遞到查詢中的起始緯度/經度點。緯度和經度點將從數組中檢索 - 所以它將成爲像遍歷數組一樣的foreach,並將每個執行的兩個緯度/經度值傳遞到查詢中。

我該怎麼做這樣的事情?

我的查詢和我認爲的實現方式如下所示:(X,Z值是將要傳遞的參數緯度/經度值,Y和T將通過執行一定的計算來獲得,我將處理)。爲了清楚起見,因爲它計算並返回請求落入小時間隔(時間戳)的數量我的查詢返回多列和多圓柱結果(時間戳和計數)

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; 

回答

2
  • 傳遞一個數組函數和FOR r IN SELECT * FROM unnest(the_array) LOOP覆蓋數組中的元素,其中rrecord變量,該變量位於該函數的DECLARE子句中;或者

  • 循環傳遞給函數的refcursor。請參閱PL/PgSQL cursors

更妙的是,避免LOOPSELECT unnest(thearray)集成到您的CTE。 PL/PgSQL中的循環比SQL CTE中的循環要慢得多。

參見unnest,LOOP

+0

我想我會去第二個,因爲我必須通過大約100萬個單獨的緯度/經度值,結果將在C++端處理,所以速度至關重要。非常感謝提示。 – sm90901

+1

@ sm90901哎呀,你肯定不想要一個數組呢! refcursors或臨時表是這樣的數據量的方式。 –

+0

將查看這些,再次感謝。 – sm90901