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