[pgsql-jp: 35829] RECORD型を返す関数

Arikata Koichi arikatakou @ silicon-breath.jp
2005年 8月 16日 (火) 02:20:07 JST


初めて投稿させていただきます。有方と申します。
PL/pgSQL言語で複合型・複数行を返す関数の使用について、
過去ログを参照し、利用しようとしましたが、うまくいきません。

以下、関数本体を添付します。
ちょっと長くなるので、SELECT句の選択列は減らしています。
LOOPのIN句にあるステートメントが長すぎるのでしょうか?
それとも変数の取り扱いにおかしな部分があるのでしょうか?
ちなみに、関連過去ログにあった引用部分をコピー&ペースト
すると、正しく動作します。また、関数本体のSELECT文も、
引数を手動で与えて実行すると正しく動作します。

PostgreSQLのバーションは8.0.3です。
初歩的な事で申し訳ありませんがよろしくお願い致します。
------------------------------------------------
関数本体:
CREATE OR REPLACE FUNCTION usp_programlist_get(int4)
  RETURNS SETOF RECORD AS
$BODY$
DECLARE
	prmMemberID ALIAS FOR $1;
	ProgramList RECORD;
BEGIN
	if prmMemberID is null then
	    FOR ProgramList IN (
		SELECT	 P.ProgramID			AS ProgramID
			,P.ProgramName		AS ProgramName
			,P.ProgramDivisionID		AS ProgramDivisionID
			,PD.ProgramDivisionName 	AS
ProgramDivisionName
			,Null				AS
RecentClickDatetime
			,Null				AS RealReturnPoint
			,Null 				AS
RecognitionDateTime
		FROM	(
			    SELECT  *
			    FROM    M_Program
			    WHERE   DeleteDateTime is null
			) M_Program P
			LEFT OUTER JOIN B_ProgramDivision PD	ON
P.ProgramDivisionID=BP.ProgramDivisionID
			)
	    		LOOP 
	    return next ProgramList;
	    END LOOP;
	else
	    FOR ProgramList IN (
		SELECT	 P.ProgramID			AS ProgramID
			,P.ProgramName		AS ProgramName
			,P.ProgramDivisionID		AS ProgramDivisionID
			,PD.ProgramDivisionName 	AS
ProgramDivisionName
			,C.ClickDateTime 		AS
RecentClickDatetime
			,C.ReturnPoint 		AS RealReturnPoint
			,RecognitionDateTime		AS
RecognitionDateTime
			FROM	(
				    SELECT  *
				    FROM    M_Program
				    WHERE   DeleteDateTime is null
				) M_Program P
				LEFT OUTER JOIN B_ProgramDivision	PD
ON P.ProgramDivisionID=BP.ProgramDivisionID
				LEFT OUTER JOIN	(
							SELECT	*
							FROM	D_Click
							WHERE	MemberID =
prmMemberID
								AND
LastClickJudgeFlag = 1				
							) D_Click
C			ON	P.ProgramID = C.ProgramID
			)
		LOOP 
		return next ProgramList;
		END LOOP;
	end if;

IF NOT FOUND THEN
    RAISE EXCEPTION 'not found';
END IF;    
	
	return;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

問い合わせSQL:
select * from usp_programlist_get(10005) AS (
 ProgramID		integer
,ProgramName		text
,ProgramDivisionID	integer
,ProgramDivisionName	text
,RecentClickDatetime	timestamp
,RealReturnPoint	integer
,RecognitionDateTime	timestamp
,AffiliateName	text
,UserIDString		text
);

エラーメッセージ:
ERROR:  wrong record type supplied in RETURN NEXT
CONTEXT:  PL/pgSQL function "usp_programlist_get" line 103 at return next




pgsql-jp メーリングリストの案内