-- レビューテーブル 変更
CREATE OR REPLACE FUNCTION f_review_update(
    IN integer,

    IN integer,
    IN integer,
    IN integer,
    IN integer,
    IN character varying,

    IN character varying,
    IN character varying,
    IN integer,

    OUT errcd integer,
    OUT errmsg character varying,
    OUT code integer) AS
$$

DECLARE
    kubun ALIAS FOR $1;                  -- 区分

    i_reviewcd ALIAS FOR $2;             -- レビューコード
    i_itemcd ALIAS FOR $3;               -- 商品コード
    i_usercd ALIAS FOR $4;               -- ユーザーコード
    i_rankingrate ALIAS FOR $5;          -- ランキング
    i_comment ALIAS FOR $6;              -- コメント

    i_updusrnm ALIAS FOR $7;             -- 更新ユーザー名
    i_updpcnm ALIAS FOR $8;              -- 更新マシン名
    i_updcnt ALIAS FOR $9;               -- UpdCnt

    cntcheck integer;
    nowdate timestamp;
    newupdcnt integer;

BEGIN
-- 必須チェック --

    IF kubun IS NULL OR kubun NOT IN (1,2,3) THEN
        RAISE EXCEPTION '処理区分が不正です';
    END IF;

    IF i_updusrnm IS NULL THEN
        RAISE EXCEPTION '更新ユーザー名の引数は必須です';
    END IF;
    IF i_updpcnm IS NULL THEN
        RAISE EXCEPTION '更新PC名の引数は必須です';
    END IF;

    IF kubun IN (1,2) THEN
		IF i_itemcd IS NULL THEN
		    RAISE EXCEPTION '商品コードの引数は必須です';
		END IF;
		IF i_usercd IS NULL THEN
		    RAISE EXCEPTION 'ユーザーコードの引数は必須です';
		END IF;
		IF i_rankingrate IS NULL THEN
		    RAISE EXCEPTION 'ランキングの引数は必須です';
		END IF;
		IF i_comment IS NULL THEN
            RAISE EXCEPTION 'コメントの引数は必須です';
        END IF;
    END IF;

    IF kubun IN (2,3) THEN
	    IF i_reviewcd IS NULL THEN
	        RAISE EXCEPTION 'レビューコードの引数は必須です';
	    END IF;
        IF i_updcnt IS NULL THEN
            RAISE EXCEPTION 'UpdCntの引数は必須です';
        END IF;
    END IF;

	-- 存在チェック
    IF kubun IN (1,2) THEN
        SELECT itemcd INTO cntcheck FROM t_item_basic_attr WHERE itemcd = i_itemcd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION '商品コードは存在しません';
    	END IF;
        SELECT membercd INTO cntcheck FROM t_member_basic_attr WHERE membercd = i_usercd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION 'ユーザーコードは存在しません';
    	END IF;
    END IF;

    IF kubun IN (2,3) THEN
        SELECT reviewcd INTO cntcheck FROM t_review WHERE reviewcd = i_reviewcd;
	    IF NOT FOUND THEN
	        RAISE EXCEPTION 'レビューコードは存在しません';
	    END IF;
    END IF;

    -- 更新カウンタチェック
    IF kubun IN (2,3) THEN
        SELECT updcnt INTO cntcheck FROM t_review WHERE reviewcd = i_reviewcd;
          IF NOT FOUND OR cntcheck <> i_updcnt THEN
            errcd := -11;
            errmsg := '更新カウンタが不正';
            RETURN;
          END IF;
    END IF;

    --- 更新処理 ---

    IF kubun = 1 THEN
        INSERT INTO t_review (
            itemcd,
            usercd,
            rankingrate,
            comment,
            createdate,
            delflg,
            updusrnm,
            updpcnm,
            updcnt)
        VALUES(
            i_itemcd,
            i_usercd,
            i_rankingrate,
            i_comment,
            'now',
            FALSE,
            i_updusrnm,
            i_updpcnm,
            0);

        errcd := 1;
        errmsg := '追加完了';
        code := lastval();
        RETURN;

    -- æ›´æ–°
    ELSIF kubun = 2 THEN
        UPDATE t_review SET
            itemcd      = i_itemcd,
            usercd      = i_usercd,
            rankingrate = i_rankingrate,
            comment     = i_comment,
            updusrnm    = i_updusrnm,
            updpcnm     = i_updpcnm
            WHERE reviewcd = i_reviewcd;

        errcd := 1;
        errmsg := '変更完了';
        code := i_reviewcd;
        RETURN;

    -- 削除
    ELSIF kubun = 3 THEN
        UPDATE t_review SET
            delflg = TRUE,
            upddate  = nowdate,
            updusrnm = i_updusrnm,
            updpcnm  = i_updpcnm
            WHERE  reviewcd = i_reviewcd;

        errcd := 1;
        errmsg := '削除完了';
        code := i_reviewcd;
        RETURN;

    END IF;

END;
$$
LANGUAGE 'plpgsql' VOLATILE;