1. 程式人生 > >postgres函式(雙重迴圈)

postgres函式(雙重迴圈)

先看基本的語法:

NameCREATE FUNCTION
CREATE [ OR REPLACE ] FUNCTION

   name( [ [argmode] [argname]argtype[ { DEFAULT | = }default_expr] [, ...] ] )

        [ RETURNSrettype

          | RETURNS TABLE (column_namecolumn_type[, ...] ) ]

   { LANGUAGElang_name

        | WINDOW

| IMMUTABLE | STABLE | VOLATILE

        | CALLED ON NULL
INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | COSTexecution_cost | ROWSresult_rows | SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT } | AS 'definition' | AS 'obj_file', 'link_symbol'
} ... [ WITH (attribute[, ...] ) ]

給一個參考連結函式語法詳細說明
但是我看了這個語法之後有點一頭霧水,畢竟定義裡的東西比較全面,很多用不到。所以寫一個簡單的理解和小例子來解釋一下。

首先說明我的需求:我希望將某一個點的橫縱座標逐漸遞加使之變為覆蓋一個區域的座標集合,同時將這些經緯度插入到資料庫。比如說從(0,0)開始,以0.1遞加到(1,1)。顯然這是一個雙重迴圈,先x方向遞加,到達界值y加上一個精度值,再接著迴圈。

CREATE OR REPLACE FUNCTION createdata (maxnum INTEGER) 
RETURNS void AS
$BODY$ DECLARE longtude FLOAT ; DECLARE latitude FLOAT ; DECLARE i INTEGER ; DECLARE j INTEGER ; BEGIN j := 0 ; i := 0 ; FOR i IN 0..10 LOOP j = 0 ; FOR j IN 0..20 LOOP maxnum = maxnum + 1 ; INSERT INTO MYTABLENAME ( "x", "y", "id" ) VALUES ( x, y, maxnum, ) ; x= x+ 0.2 ; END loop ; x= 110.0 ; y=y+0.2; END loop ; END ; $BODY$ LANGUAGE plpgsql; SELECT createdata (1929)

邏輯是不是很簡單。有幾個點需要稍微注意下:
(1)定義的變數使用時不需要引號,直接使用就可以;
(2)建立好的函式可以在資料庫裡的函式中檢視。
(3)本來覺的挺難的,結果一寫又覺得好簡單~果然實踐是最好課堂