[pgsql-jp: 34640] Re: ネストしたFOR文
Default Non Name
illuminate33 @ hotmail.com
2005年 1月 13日 (木) 19:33:47 JST
お騒がせしました。
添え字の間違い、変数の初期化し忘れ、凡ミスを繰り返した末に
なんとか自力解決しました。
(カーソルを使ってしまいましたが、使わなくてもできたのかな?)
こんな感じです。
CREATE OR REPLACE FUNCTION stat_content ()
RETURNS opaque AS '
DECLARE
column integer;
row integer;
result ccallinonev%ROWTYPE;
i integer;
j integer;
k integer;
test_cursor refcursor;
counter integer;
text_query text;
BEGIN
column:=12;
row:=13;
DELETE FROM summingupt WHERE code=2;
INSERT INTO summingupt (code) VALUES (2);
j:=1;
RAISE NOTICE ''%'', row;
WHILE (j<=row) LOOP
i:=1;
RAISE NOTICE ''%'', column;
WHILE (i<=column) LOOP
k:=(CASE WHEN (i%2=0) THEN i/2 WHEN (i%2=1) THEN (i+1)/2 END);
RAISE NOTICE ''%, %, %'', i,j,k;
counter:=0;
OPEN test_cursor FOR
SELECT * FROM ccallinonev
WHERE CASE WHEN (j<=10) THEN (j=ccallinonev.department)
WHEN (j=11) THEN (ccallinonev.department>=11 OR
ccallinonev.department=0)
ELSE TRUE END
AND CASE WHEN (k<=4) THEN (k=ccallinonev.technologicalmethod)
WHEN (k=5) THEN (ccallinonev.technologicalmethod>=5 OR
ccallinonev.technologicalmethod=0)
ELSE TRUE END
AND CASE WHEN (j<>13) THEN
(NEW.queryfirstdate<=ccallinonev.reception_date
AND NEW.querylastdate>=ccallinonev.reception_date)
WHEN (j=13) THEN ((NEW.queryfirstdate-INTERVAL ''1 year'')
<=ccallinonev.reception_date
AND (NEW.querylastdate-INTERVAL ''1 year'')
>=ccallinonev.reception_date) END
AND CASE WHEN (i%2=0) THEN (ccallinonev.commission=NEW.commissionpraise)
ELSE TRUE END;
LOOP
FETCH test_cursor INTO result;
EXIT WHEN NOT FOUND;
counter:=counter+1;
END LOOP;
CLOSE test_cursor;
RAISE NOTICE ''%'', counter;
text_query:=''UPDATE summingupt SET
dep''||j||''_''||i||''=''||counter||'' WHERE code=2;'';
RAISE NOTICE ''%'', text_query;
EXECUTE text_query;
i:=i+1;
END LOOP;
j:=j+1;
END LOOP;
RETURN NEW;
END; 'LANGUAGE 'plpgsql';
CREATE TRIGGER stat_content_t AFTER INSERT OR UPDATE
ON gstattable FOR EACH ROW
EXECUTE PROCEDURE stat_content();
>
>Message: 6
>To: <pgsql-jp @ ml.postgresql.jp>
>Date: Wed, 12 Jan 2005 22:32:04 +0900
>From: "CM" <illuminate33 @ hotmail.com>
>Subject: [pgsql-jp: 34626] FORのネストとEXECUTE
>Reply-To: pgsql-jp @ ml.postgresql.jp
>
>
>またもやplpgsqlストアドで詰まっています。
>Windows 2000 Server の Postgresql-7.2.1でcygwin-1.3.12-4です。
>
>顧客情報のテーブルccallinoneuから、適宜期間をエンドユーザーに
>入力させて数値項目を集計し、自動的にsumminguptテーブルに
>集積する形にしたいのですが、無理でしょうか?
>どうしても22行目のLOOPの近くにおかしいところがあるよ、でERRORが出てしまいま
>す。(素人の疑問なのですが、この行数ってどこから出てくるんでしょうか?
>pg_procのprosrcで見てもよくわからないし。;(セミコロン)の位置か、それとも
単
>純に改行コードの位置なんでしょうか?)
>
>動的問い合わせがまずいのか、SELECT INTOの使い方がまずいのか、いろいろやって
>みましたが、
>どうしてもうまくいきません。
CM
pgsql-jp メーリングリストの案内