psql 卡住了…

1. DBMS 環境:

psql (PostgreSQL) 8.3.3
contains support for command-line editing

2. 想法:

Table 1 (其中,~ 為一些欄位,除了 ba 之外,所有欄位都有資料)

mapno tsuga ba
——-+ ~ +—–+—————–
bigint int double precision

Table 2

mapno ba
——-+ ~ +—————–+
bigint double precision

我想做的事情是,如果 Table 1 中 tsuga 的欄位是某個特定值,例如說 1 好了
就把 Table 2 中的 ba 值進行 log 計算後複製到 Table 1 中的 ba 欄位

3. 我的作法

1 CREATE FUNCTION updatenf2() RETURNS void AS $$
2 DECLARE
3 tsuga_ba double precision;
4
5 BEGIN
6 FOR tsuga_ba in SELECT log(ba) as ba from nf_sample_tsuga WHERE ba!=0 LOOP
7 UPDATE nf_releve SET ba=tsuga_ba WHERE tsuga=1;
8 END LOOP;
9 END;
10
11 $$ LANGUAGE plpgsql;

接下來 select updatenf2()

不過很奇怪的是,它似乎在 ba 欄位中的數字都一模一樣,看了很久不知道問題在哪邊

mapno | ~ | tsuga | ba
————-+—-+——-+—-
95192108140 | ~ | 1 | 3.17974616415469
95192109015 | ~ | 1 | 3.17974616415469
95192113035 | ~ | 1 | 3.17974616415469
95192113041 | ~ | 1 | 3.17974616415469
95192113167 | ~ | 1 | 3.17974616415469

結果,發現我想錯了,經過 sunpoet 的提點,因為 tsuga=1 loop 之後,就是同樣的值

因此我重新思考這個問題,因為 table2 mapno 和 table 1 mapno 是一樣的,所以我就用下面的 function 來執行


1 CREATE FUNCTION updatenf2() RETURNS void AS $$
2 DECLARE
3 tsuga_ba double precision;
4 mapno_id bigint;
5
6 BEGIN
7 FOR tsuga_ba,mapno_id in SELECT log(ba) AS ba,mapno FROM nf_sample_tsuga WHERE ba!=0 LOOP
8 UPDATE nf_releve SET ba=tsuga_ba WHERE nf_releve.mapno=mapno_id;
9 END LOOP;
10 END;
11
12 $$ LANGUAGE plpgsql;

結果就正確得到我要的結果了!

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s