CREATE OR REPLACE FUNCTION f_recommend_update(
    IN integer,
    IN integer,
    IN date,
    IN date,
    IN integer,

    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_itemcd ALIAS FOR $2;          -- ニュースコード
    i_startdate ALIAS FOR $3;       -- お勧め開始日
    i_closedate ALIAS FOR $4;       -- お勧め終了日
    i_priority ALIAS FOR $5;        -- お勧め度

    i_updusrnm ALIAS FOR $6;        -- 更新ユーザ
    i_updpcnm ALIAS FOR $7;         -- 更新マシン(IPアドレス)
    i_updcnt ALIAS FOR $8;

    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_itemcd IS NULL THEN
        RAISE EXCEPTION 'アイテムコードの引数は必須です';
    END IF;

    IF kubun IN (2,3) THEN

        IF i_updcnt IS NULL THEN
            RAISE EXCEPTION '更新カウンタの引数は必須です';
        END IF;
    END IF;
    IF kubun IN (1,2) THEN

        IF i_startdate IS NULL THEN
            RAISE EXCEPTION 'お勧め開始日の引数は必須です';
        END IF;
        IF i_startdate IS NULL THEN
            RAISE EXCEPTION 'お勧め終了日の引数は必須です';
        END IF;
        IF i_priority IS NULL THEN
            RAISE EXCEPTION 'お勧め度の引数は必須です';
        END IF;

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

        IF i_updpcnm IS NULL THEN
            RAISE EXCEPTION '更新マシンの引数は必須です';
        END IF;
    END IF;

    -- 存在チェック
    IF kubun = 1 THEN
        SELECT itemcd INTO cntcheck FROM t_item_basic_attr WHERE itemcd = i_itemcd;
        IF NOT FOUND THEN
            RAISE EXCEPTION 'アイテムコードは存在しません';
        END IF;
        SELECT itemcd INTO cntcheck FROM t_recommend WHERE itemcd = i_itemcd;
        IF FOUND THEN
            RAISE EXCEPTION 'お勧め商品としてすでに登録されています';
        END IF;

    ELSIF kubun IN (2,3) THEN
        SELECT itemcd INTO cntcheck FROM t_recommend WHERE itemcd = i_itemcd;
          IF NOT FOUND THEN
            RAISE EXCEPTION 'アイテムコードは存在しません';
        END IF;
    END IF;

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


    --- 更新処理 ---


    nowdate := 'now';              -- 現在の日時を取得
    IF kubun IN (2,3) THEN
        newupdcnt := i_updcnt+1;   -- 更新カウントを進める
    END IF;

    -- 追加
    IF kubun = 1 THEN
        INSERT INTO t_recommend (
            itemcd,
            startdate,
            closedate,
            priority,
            delflg,
            adddate,
            upddate,
            updusrnm,
            updpcnm,
            updcnt)
        VALUES(
            i_itemcd,
            i_startdate,
            i_closedate,
            i_priority,
            FALSE,
            nowdate,
            nowdate,
            i_updusrnm,
            i_updpcnm,
            0);

    -- æ›´æ–°
    ELSIF kubun = 2 THEN
        UPDATE t_recommend SET
            startdate  = i_startdate,
            closedate  = i_closedate,
            priority   = i_priority,
            upddate    = nowdate,
            updusrnm   = i_updusrnm,
            updpcnm    = i_updpcnm,
            updcnt     = newupdcnt,
            delflg     = FALSE
            WHERE itemcd = i_itemcd;

    -- 削除
    ELSIF kubun = 3 THEN
        UPDATE t_recommend SET
            delflg = TRUE,
            upddate  = nowdate,
            updusrnm = i_updusrnm,
            updpcnm  = i_updpcnm,
            updcnt   = newupdcnt
        WHERE itemcd = i_itemcd;
    END IF;

    code := 1;
END;
$$
LANGUAGE 'plpgsql' VOLATILE;