[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 メーリングリストの案内